1.內置變量
playbook中有許多內置變量,列舉幾個常用的。
(1)groups和group_names
{{ groups }}會打印inventory下面的所有主機和主機組信息
{{ groups['nginx'] }}打印nginx主機組的信息
{{ group_names }}打印當前主機所在的groups名稱。
(2)hostvars
{{ hostvars[host] }}會返回某個主機的變量,需要傳入諸暨信息,返回一個JSON字符串
(3)inventory_hostname和inventory_hostname_short
{{ inventory_hostname }}返回inventory里定義的主機名
{{ inventory_hostname_short }}返回inventory文件中主機名的第一部分
(4)play_hosts和inventory_dir
{{ play_hosts }}返回當前playbook運行的主機信息
{{ inventory_dir }}返回當前playbook使用的Inventory目錄
2.Jinjia2 filter
jinjia2是一個python的模板引擎,主要是受Django模板系統的啟發。
關於Django模板系統的博客:https://www.cnblogs.com/yangmingxianshen/p/8283885.html
Ansible默認支持Jinjia2語言內置filter。
Ansible使用jinjia2模板來啟動動態表達式和訪問變量。
Jinjia2所有的內置filter:http://jinja.pocoo.org/docs/2.10/templates/#builtin-filters
當然Ansible不僅僅只支持Jinjia2的過濾器,還有一些自定義的過濾器。
Ansible中所有過濾器:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html
格式化數據的過濾器
如果你想某個變量轉化為json或者是yaml格式(這樣playbook就可以直接使用):
{{ some_variable | to_json }}
{{ some_variable | to_yaml }}
如果你想輸出對人類更加友好的方式:
{{ some_variable | to_nice_json }}
{{ some_variable | to_nice_yaml }}
我們還可以設置縮進:
{{ some_variable | to_nice_json (indent = 2)}}
{{ some_variable | to_nice_yaml (indent = 8)}}
to_yaml和to_nice_yaml這兩個過濾器使用的是PyYAML這個庫,它默認80個字符串長度。
這可能會導致意外的換行符,如果你想避免這種行為,可以配置width屬性:
{{ some_variable | to_yaml (indent = 8, width=1204)}}
{{ some_variable | to_nice_yaml (indent = 8, width=1204)}}
如果要解析多文檔yaml字符串,使用from_yaml_all可以返回YAML文件的生成。
tasks: - shell: cat /some/path/to/multidoc-file.yaml register: result - debug: msg: '{{ item }}' loop: '{{ result.stdout | from_yaml_all | list }}'
如果我們沒有定義一個變量,但是卻調用了,這是就會報錯:
可以使用mandatory進行顯示檢查:
{{ variable | mandatory }}
當然,也可以給它一個默認值:
{{ some_variable | default(5) }}
如果在變量計算為false或空字符串使用默認值,則必須將第二個參數設置為true。
{{ lookup('env', 'MY_USER') | default('admin', true) }}
列表過濾器
獲取最小值:
{{ list1 | min }}
獲取最大值:
{{ [3, 4, 2] | max }}
獲取平均值:
{{ [3, [4, 2] ] | flatten }}
還可以指定層級:
{{ [3, [4, [2]] ] | flatten(levels=1) }}
集合過濾器
唯一集:
{{ list1 | unique }}
並集:
{{ list1 | union(list2) }}
交集:
{{ list1 | intersect(list2) }}
差集:
{{ list1 | difference(list2) }}
對稱差集:
{{ list1 | symmetric_difference(list2) }}
切片過濾器
將字典轉化為列表:
{{ dict | dict2items }}
還可以傳入參數:
{{ files | dict2items(key_name='file', value_name='path') }}
壓縮過濾器
組合列表:
- name: give me list combo of two lists debug: msg: "{{ [1,2,3,4,5] | zip(['a','b','c','d','e','f']) | list }}"
用盡所有列表:
- name: give me longest combo of three lists , fill with X debug: msg: "{{ [1,2,3] | zip_longest(['a','b','c','d','e','f'], [21, 22, 23], fillvalue='X') | list }}