变量命名
支持数字、字母、下划线
有效:foo_port, foo5无效:foo-port, foo port, foo.port, 12
playbook定义
- hosts: webservers vars: http_port: 80
jinja2模板使用变量
My amp goes to { { max_amp_value }}template: src=foo.cfg.j2 dest={ { remote_install_path }}/foo.cfg
Jinja2 Filters
格式化数据
{ { some_variable | to_nice_json }}{ { some_variable | to_nice_yaml }}
使用条件表达式
tasks: - shell: /usr/bin/foo register: result ignore_errors: True - debug: msg="it failed" when: result|failed # in most cases you'll want a handler, but if you want to do something right now, this is nice - debug: msg="it changed" when: result|changed - debug: msg="it succeeded" when: result|success - debug: msg="it was skipped" when: result|skipped
强制变量定义
{ { variable | mandatory }}
变量默认值
{ { some_variable | default(5) }}
变量省略值
- name: touch files with an optional mode file: dest={ {item.path}} state=touch mode={ {item.mode|default(omit)}} with_items: - path: /tmp/foo - path: /tmp/bar - path: /tmp/baz mode: "0444"
列表
# 最小值{ { list1 | min }}# 最大值{ { [3, 4, 2] | max }}# 唯一值{ { list1 | unique }}# 并集{ { list1 | union(list2) }}# 交集{ { list1 | intersect(list2) }}# 补集(存在list1,不存在list2){ { list1 | difference(list2) }}# 对称差集 (不同时存在每个列表){ { list1 | symmetric_difference(list2) }}
版本比较
{ { ansible_distribution_version | version_compare('12.04', '>=') }}# <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne# 版本分析strict=True,默认值false
随机数
{ { ['a','b','c']|random }} => 'c'{ { 59 |random}} * * * * root /script/from/cron{ { 100 |random(step=10) }} => 70{ { 100 |random(1, 10) }} => 31{ { 100 |random(start=1, step=10) }} => 51
洗牌(shuffle)
{ { ['a','b','c']|shuffle }} => ['c','a','b']{ { ['a','b','c']|shuffle }} => ['b','c','a']
其他
# 列表转字符串{ { list | join(" ") }}# 文件全路径{ { path | basename }}# 目录全路径{ { path | dirname }}# 用户目录(~)全路径{ { path | expanduser }}# link的路径{ { path | readlink }}# Base64加解密{ { encoded | b64decode }}{ { decoded | b64encode }}# 文件的sha1sum{ { filename | sha1 }}
bool
- debug: msg=test when: some_string_value | bool
正则
vars: url: "http://example.com/users/foo/resources/bar"tasks: - shell: "msg='matched pattern 1'" when: url | match("http://example.com/users/.*/resources/.*") - debug: "msg='matched pattern 2'" when: url | search("/users/.*/resources/.*")# convert "ansible" to "able"{ { 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }}# convert "foobar" to "bar"{ { 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }}
- hosts: app_servers vars: app_path: "{ { base_path }}/22"
Facts
'''bash
ansible hostname -m setup{
{ ansible_devices.sda.model }} { { ansible_hostname }} '''Turning Off Facts
- hosts: whatever gather_facts: no
本地facts(自定义facts)
# /etc/ansible/facts.d/preferences.fact[general]asdf=1bar=2# 命令ansible-m setup -a "filter=ansible_local"# API"ansible_local": { "preferences": { "general": { "asdf" : "1", "bar" : "2" } } }# 引用{ { ansible_local.preferences.general.asdf }}# 部署- hosts: webservers tasks: - name: create directory for ansible custom facts file: state=directory recurse=yes path=/etc/ansible/facts.d - name: install custom impi fact copy: src=ipmi.fact dest=/etc/ansible/facts.d - name: re-read facts after adding custom fact setup: filter=ansible_local
Fact Caching
{ { hostvars['asdf.example.com']['ansible_os_family'] }}# /etc/ansible/ansible.cfg[defaults]fact_caching = redisfact_caching_timeout = 86400# secondsyum install redisservice redis startpip install redis
Registered Variables
- hosts: web_servers tasks: - shell: /usr/bin/foo register: foo_result ignore_errors: True - shell: /usr/bin/bar when: foo_result.rc == 5
Accessing Complex Variable Data
{ { ansible_eth0["ipv4"]["address"] }}{ { ansible_eth0.ipv4.address }}{ { foo[0] }}
Magic Variables, and How To Access Information About Other Hosts
{ { hostvars['test.example.com']['ansible_distribution'] }}{% if 'webserver' in group_names %} # some part of a configuration file that only applies to webservers{% endif %}{% for host in groups['app_servers'] %} # something that applies to all app servers.{% endfor %}# example{% for host in groups['app_servers'] %} { { hostvars[host]['ansible_eth0']['ipv4']['address'] }}{% endfor %}
Variable File Separation
---- hosts: all remote_user: root vars: favcolor: blue vars_files: - /vars/external_vars.yml tasks: - name: this is just a placeholder command: /bin/echo foo---# in the above example, this would be vars/external_vars.ymlsomevar: somevaluepassword: magic
Passing Variables On The Command Line
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"#example---- hosts: '{ { hosts }}' remote_user: '{ { user }}' tasks: - ...ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"or--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'or--extra-vars "@some_file.json"
Variable Precedence: Where Should I Put A Variable?
#组变量默认值在group_vars/all---# file: /etc/ansible/group_vars/all# this is the site wide defaultntp_server: default-time.example.com# 组变量,覆盖组默认变量---# file: /etc/ansible/group_vars/bostonntp_server: boston-time.example.com# 主机变量,覆盖组变量---# file: /etc/ansible/host_vars/xyz.boston.example.comntp_server: override.example.com
role variable precedence
---# file: roles/x/defaults/main.yml# if not overridden in inventory or as a parameter, this is the value that will be usedhttp_port: 80# 不能覆盖默认值---# file: roles/x/vars/main.yml# this will absolutely be used in this rolehttp_port: 80# 使用这种方式覆盖默认值roles: - { name: apache, http_port: 8080 }roles: - { role: app_user, name: Ian } - { role: app_user, name: Terry } - { role: app_user, name: Graham } - { role: app_user, name: John }# roles/common/vars/main.ymlroles: - { role: common_settings } - { role: something, foo: 12 } - { role: something_else }
posted on 2015-01-04 11:27 阅读( ...) 评论( ...)