Ansible-playbook
一、Ansible facts
[ansible@hk-elk-redis1 ansible]$ ansible 10.20.11.201 -m setup 10.20.11.201 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "10.20.11.201" ], "ansible_all_ipv6_addresses": [ "fe80::250:56ff:feb8:80f4" ], "ansible_apparmor": { "status": "disabled" }, "ansible_architecture": "x86_64", "ansible_bios_date": "04/05/2016", "ansible_bios_version": "6.00", "ansible_cmdline": { -----省略----- [ansible@hk-elk-redis1 ansible]$ ansible 10.20.11.201 -m setup -a 'filter=ansible_all_ipv4_addresses' ##查看特定的行 10.20.11.201 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "10.20.11.201" ] }, "changed": false }
二、Ansible-playbook
1使用register内的变量
[ansible@hk-elk-redis1 playbook]$ cat register.yaml --- - hosts: all gather_facts: False tasks: - name: register variables shell: hostname register: info - name: display variable debug: msg="The variable is {{ info }}" [ansible@hk-elk-redis1 playbook]$ ansible-playbook register.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [register variables] **************************************************************************************************************************************************************************************************************************************************** changed: [10.20.11.201] TASK [display variable] ****************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => { "msg": "The variable is {'stderr_lines': [], u'changed': True, u'end': u'2018-12-20 14:35:53.043939', 'failed': False, u'stdout': u'hk-elk-redis2', u'cmd': u'hostname', u'rc': 0, u'start': u'2018-12-20 14:35:53.015943', u'stderr': u'', u'delta': u'0:00:00.027996', 'stdout_lines': [u'hk-elk-redis2']}" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=2 changed=1 unreachable=0 failed=0 我们可以看到info的结果是一段python字典数据,里面存储着很多信息包括执行时间状态输出等信息,如果需要下面标准输出stdout的信息时,只需指定stdout这个key即可 [ansible@hk-elk-redis1 playbook]$ vim register.yaml --- - hosts: all gather_facts: False tasks: - name: register variables shell: hostname register: info - name: display variable debug: msg="The variable is {{ info['stdout'] }}" [ansible@hk-elk-redis1 playbook]$ ansible-playbook register.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [register variables] **************************************************************************************************************************************************************************************************************************************************** changed: [10.20.11.201] TASK [display variable] ****************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => { "msg": "The variable is hk-elk-redis2" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=2 changed=1 unreachable=0 failed=0
2、使用vars_prompt传入
[ansible@hk-elk-redis1 playbook]$ cat vars_prompt.yaml --- - hosts: all gather_facts: no vars_prompt: - name: "one" prompt: "please input one value" private: no - name: "two" prompt: "please input two value" default: "good" private: yes tasks: - name: display one value debug: msg="one value is {{ one }}" - name: display two value debug: msg="two value is {{ two }}" 例子中通过vars_prompt参数进行交互传入两个变量的值,two定义了一个默认值,one没有。private表示输入是否在屏幕显示 [ansible@hk-elk-redis1 playbook]$ ansible-playbook vars_prompt.yaml -l 10.20.11.201 please input one value: hehe please input two value [good]: PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [display one value] ***************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => { "msg": "one value is hehe" } TASK [display two value] ***************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => { "msg": "two value is cc" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=2 changed=0 unreachable=0 failed=0
三、ansible-playbook循环
1、标准Loops with_items
[ansible@hk-elk-redis1 playbook]$ cat loops.yaml --- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="name ----> {{ item }}" with_items: - one - two 运行结果: [ansible@hk-elk-redis1 playbook]$ ansible-playbook loops.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => (item=one) => { "changed": false, "item": "one", "msg": "name ----> one" } ok: [10.20.11.201] => (item=two) => { "changed": false, "item": "two", "msg": "name ----> two" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=1 changed=0 unreachable=0 failed=0 with_items的值是python list结果,可以理解为每个task都会循环读取list里面的值,然后key的值是item,当然list里面也支持python字典,如下 [ansible@hk-elk-redis1 playbook]$ cat loops.yaml --- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="name ----> {{ item.key }} value ----->{{ item.value }}" with_items: - {key: 'one', value: 'VAULE1'} - {key: 'two', value: 'VAULE2'} 运行结果: [ansible@hk-elk-redis1 playbook]$ ansible-playbook loops.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => (item={u'key': u'one', u'value': u'VAULE1'}) => { "changed": false, "item": { "key": "one", "value": "VAULE1" }, "msg": "name ----> one value ----->VAULE1" } ok: [10.20.11.201] => (item={u'key': u'two', u'value': u'VAULE2'}) => { "changed": false, "item": { "key": "two", "value": "VAULE2" }, "msg": "name ----> two value ----->VAULE2" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=1 changed=0 unreachable=0 failed=0
2、嵌套Loops with_nested
[ansible@hk-elk-redis1 loop]$ cat with_nested.yaml --- - hosts: all gather_facts: True tasks: - name: debug loops debug: msg="name --------> {{ item[0] }} key-------> {{ item[1] }}" with_nested: - ['A'] - ['1','2','3'] 执行结果 [ansible@hk-elk-redis1 loop]$ ansible-playbook with_nested.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************************************************* ok: [10.20.11.201] TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => (item=[u'A', u'1']) => { "changed": false, "item": [ "A", "1" ], "msg": "name --------> A key-------> 1" } ok: [10.20.11.201] => (item=[u'A', u'2']) => { "changed": false, "item": [ "A", "2" ], "msg": "name --------> A key-------> 2" } ok: [10.20.11.201] => (item=[u'A', u'3']) => { "changed": false, "item": [ "A", "3" ], "msg": "name --------> A key-------> 3" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=2 changed=0 unreachable=0 failed=0
3、散列loops with_dict
[ansible@hk-elk-redis1 loop]$ cat with_dict.yaml --- - hosts: all gather_facts: False vars: user: fengct: name: fengct shell: bash test: name: test shell: sh tasks: - name: debug loops debug: msg="name --------> {{ item.key }} keys -------> {{ item.value.name }} shell -------> {{ item.value.shell }}" with_dict: "{{ user }}" [ansible@hk-elk-redis1 loop]$ ansible-playbook with_dict.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => (item={'value': {u'shell': u'sh', u'name': u'test'}, 'key': u'test'}) => { "changed": false, "item": { "key": "test", "value": { "name": "test", "shell": "sh" } }, "msg": "name --------> test keys -------> test shell -------> sh" } ok: [10.20.11.201] => (item={'value': {u'shell': u'bash', u'name': u'fengct'}, 'key': u'fengct'}) => { "changed": false, "item": { "key": "fengct", "value": { "name": "fengct", "shell": "bash" } }, "msg": "name --------> fengct keys -------> fengct shell -------> bash" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=1 changed=0 unreachable=0 failed=0
4、文件匹配loops with_fileglob
[ansible@hk-elk-redis1 loop]$ vim with_fileglob.yaml --- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="logs files ---------> {{ item }}" with_fileglob: - /var/log/*.log [ansible@hk-elk-redis1 loop]$ ansible-playbook with_fileglob.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => (item=/var/log/boot.log) => { "changed": false, "item": "/var/log/boot.log", "msg": "logs files ---------> /var/log/boot.log" } ok: [10.20.11.201] => (item=/var/log/yum.log) => { "changed": false, "item": "/var/log/yum.log", "msg": "logs files ---------> /var/log/yum.log" } ok: [10.20.11.201] => (item=/var/log/vmware-vmsvc.log) => { "changed": false, "item": "/var/log/vmware-vmsvc.log", "msg": "logs files ---------> /var/log/vmware-vmsvc.log" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=1 changed=0 unreachable=0 failed=0
5、随机选择loops with_random_choice
[ansible@hk-elk-redis1 loop]$ cat with_random_choice.yaml --- - hosts: all gather_facts: False tasks: - name: debug loops debug: msg="name --------> {{ item }}" with_random_choice: - one - two - three [ansible@hk-elk-redis1 loop]$ ansible-playbook with_random_choice.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => (item=one) => { "changed": false, "item": "one", "msg": "name --------> one" } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=1 changed=0 unreachable=0 failed=0
6、条件判断loops until:
[ansible@hk-elk-redis1 loop]$ vim until.yaml --- - hosts: all gather_facts: True tasks: - name: debug loops shell: cat /root/ansible register: host until: host.stdout.startswith("name") retries: 5 delay: 5 5秒执行一次 cat /root/ansible将结果register给host然后判断host.stdout.startswith的内容是否是Master开头,如果条件成立,此task完成运行,如果条件不成立5秒后重试,5次后还不成立,此task运行失败 [ansible@hk-elk-redis1 loop]$ ansible-playbook until.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************************************************* ok: [10.20.11.201] TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** FAILED - RETRYING: debug loops (5 retries left). FAILED - RETRYING: debug loops (4 retries left). FAILED - RETRYING: debug loops (3 retries left). FAILED - RETRYING: debug loops (2 retries left). FAILED - RETRYING: debug loops (1 retries left). fatal: [10.20.11.201]: FAILED! => {"attempts": 5, "changed": true, "cmd": "cat /root/ansible", "delta": "0:00:00.027601", "end": "2018-12-20 15:49:47.499441", "msg": "non-zero return code", "rc": 1, "start": "2018-12-20 15:49:47.471840", "stderr": "cat: /root/ansible: 权限不够", "stderr_lines": ["cat: /root/ansible: 权限不够"], "stdout": "", "stdout_lines": []} to retry, use: --limit @/etc/ansible/playbook/loop/until.retry PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=1 changed=0 unreachable=0 failed=1
7、register Loops
执行多个task并且register给一个变量 [ansible@hk-elk-redis1 loop]$ vim register.yaml --- - hosts: all gather_facts: True tasks: - name: debug loops shell: "{{ item }}" with_items: - date - hostname - uname register: num - name: SYSTEM INFO LOOPS-----------> debug: msg="{% for i in num.results %} {{ i.stdout }} {% endfor %}" [ansible@hk-elk-redis1 loop]$ ansible-playbook register.yaml -l 10.20.11.201 PLAY [all] ******************************************************************************************************************************************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************************************************* ok: [10.20.11.201] TASK [debug loops] *********************************************************************************************************************************************************************************************************************************************************** changed: [10.20.11.201] => (item=date) changed: [10.20.11.201] => (item=hostname) changed: [10.20.11.201] => (item=uname) TASK [SYSTEM INFO LOOPS----------->] ***************************************************************************************************************************************************************************************************************************************** ok: [10.20.11.201] => { "msg": " 2018年 12月 20日 星期四 15:58:14 CST hk-elk-redis2 Linux " } PLAY RECAP ******************************************************************************************************************************************************************************************************************************************************************* 10.20.11.201 : ok=3 changed=1 unreachable=0 failed=0