Ansible 自动化运维:Playbook 编写与流程控制
1.playbook
1、使用debug模块,显示当前受管主机的dns服务器的ip地址
1.执行方法
bash
[devops@master chap03]$ vim zy1.yml
---
- name: display dns ip
hosts: all
tasks:
- name: display dns ip
debug:
msg: "当前主机{{ inventory_hostname }}的dns服务器地址为: {{ ansible_facts.dns.nameservers }}"
2.执行效果
bash
[devops@master chap03]$ ansible-playbook zy1.yml
PLAY [display dns ip] ***********************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [node01]
ok: [master]
ok: [node02]
TASK [display dns ip] **********************************************************************************
ok: [node02] => {
"msg": "当前主机node02的dns服务器地址为: ['114.114.114.114']"
}
ok: [master] => {
"msg": "当前主机master的dns服务器地址为: ['114.114.114.114']"
}
ok: [node01] => {
"msg": "当前主机node01的dns服务器地址为: ['114.114.114.114']"
}
PLAY RECAP **********************************************************************************************
master : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2、将example.conf文件复制到/etc/httpd/conf.d/目录,如果/etc/httpd/conf.d/目录下的文件更新,则重启httpd服务
1.执行方法
bash
[devops@master chap03]$ vim zy2.yml
---
- name: httpd
hosts: all
tasks:
- name: copy example.conf
copy:
src: ./example.conf
dest: /etc/httpd/conf.d/example.conf
mode: '0644'
notify: restart_httpd
handlers:
- name: restart_httpd
service:
name: httpd
state: restarted
2.执行效果
bash
[devops@master chap03]$ ansible-playbook zy2.yml
PLAY [httpd] **********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [node01]
ok: [master]
ok: [node02]
TASK [copy example.conf] **********************************************************************************
changed: [master]
changed: [node01]
changed: [node02]
RUNNING HANDLER [restart_httpd] ***************************************************************************
changed: [node01]
changed: [master]
changed: [node02]
PLAY RECAP ************************************************************************************************
master : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node01 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、向受管主机的/home/file文件里面写入内容如下:
bash
hostname=当前主机的名字
memory=当前主机的内存大小
BIOS version=当前主机的bios的版本
distribution=当前linux主机的发行版本信息
Size of disk device is 当前主机的磁盘大小
1.执行方法
bash
[devops@master chap03]$ vim zy3.yml
---
- name: write /home/file
hosts: all
tasks:
- name: write
copy:
content: |
hostname={{ ansible_facts.hostname }}
memory={{ ansible_facts.memtotal_mb }} MB
BIOS version={{ ansible_facts.bios_version }}
distribution={{ ansible_facts.distribution }} {{ ansible_facts.distribution_version }}
Size of disk device is {{ ansible_facts.devices.sda.size }}
dest: /home/file
mode: '0644'
2.执行效果
bash
[devops@master chap03]$ ansible-playbook zy3.yml
PLAY [write /home/file] ***********************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [node02]
ok: [master]
ok: [node01]
TASK [write] **********************************************************************************************
changed: [master]
changed: [node01]
changed: [node02]
PLAY RECAP ************************************************************************************************
master : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.templates
1.使用file.j2模板文件向受管主机的/home/file文件里面写入内容如下:
bash
hostname=当前主机的名字
memory=当前主机的内存大小
BIOS version=当前主机的bios的版本
distribution=当前linux主机的发行版本信息
Size of disk device is 当前主机的磁盘的大小
1.执行方法
bash
[devops@master chap03]$ vim file.j2
hostname={{ ansible_facts.hostname }}
memory={{ ansible_facts.memtotal_mb }} MB
BIOS version={{ ansible_facts.bios_version }}
distribution={{ ansible_facts.distribution }} {{ ansible_facts.distribution_version }}
Size of disk device is {{ ansible_facts.devices.sda.size }}
[devops@master chap03]$ vim zy4.yml
---
- name: write
hosts: all
tasks:
- name: write
ansible.builtin.template:
src: ./file.j2
dest: /home/file
2.执行效果
bash
[devops@master chap03]$ ansible-playbook zy4.yml
PLAY [write] **********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [master]
ok: [node01]
ok: [node02]
TASK [write] **********************************************************************************************
ok: [master]
ok: [node01]
ok: [node02]
PLAY RECAP ************************************************************************************************
master : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.ansible流程控制
1、如果当前受管主机的根分区容量大于1G,则安装httpd和mariadb-server软件包,如果httpd和 mariadb服务未运行则运行该服务。
1.执行方法
bash
[devops@master chap03]$ vim zy5.yml
---
- name: check
hosts: all
gather_facts: true
become: true
tasks:
- block:
- name: install
dnf:
name:
- httpd
- mariadb-server
state: present
- name: run httpd
service:
name: httpd
state: started
enabled: true
- name: run mariadb
service:
name: mariadb
state: started
enabled: true
when: ansible_mounts | selectattr('mount', 'equalto', '/') | map(attribute='size_total') | list | first / 1024 / 1024 > 1
2.执行效果
bash
[devops@master chap03]$ ansible-playbook zy5.yml
PLAY [check] **********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [master]
ok: [node01]
ok: [node02]
TASK [install] ********************************************************************************************
changed: [node02]
changed: [master]
changed: [node01]
TASK [run httpd] ******************************************************************************************
changed: [master]
changed: [node01]
changed: [node02]
TASK [run mariadb] ****************************************************************************************
changed: [node02]
changed: [master]
changed: [node01]
PLAY RECAP ************************************************************************************************
master : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node01 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2、创建一个playbook,要求如下: 该playbook运行在所有受控节点 该playbook覆盖/etc/message文件的内容 在dev主机组的主机上,内容是:Development 在test主机组的主机上,内容是:Test
1.执行方法
bash
[devops@master chap03]$ vim zy6.yml
---
- name: cover
hosts: all
tasks:
- name: input Development
copy:
content: Development
dest: /etc/message
when: inventory_hostname in groups.webservers
- name: input Test
copy:
content: Test
dest: /etc/message
when: inventory_hostname in groups.dbservers
2.执行效果
bash
[devops@master chap03]$ ansible-playbook zy6.yml
PLAY [cover] **********************************************************************************************
TASK [Gathering Facts] ************************************************************************************
ok: [node01]
ok: [master]
ok: [node02]
TASK [input Development] **********************************************************************************
skipping: [node01]
skipping: [node02]
changed: [master]
TASK [input Test] *****************************************************************************************
skipping: [master]
changed: [node02]
changed: [node01]
PLAY RECAP ************************************************************************************************
master : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
node01 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0