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

浙公网安备 33010602011771号