一、编写playbook的习题

使用debug模块,显示当前受管主机的dns服务器的ip地址

解答

①先用mkdir chap03建立一个名为chap03的目录

②再用cd chap03到chap03的工作目录下

③然后用vim dns_ip.yml去编辑dns_ip.yml文件,代码如下:

 ---
 - name: dns_ip
   gather_facts: yes
   hosts: all
   tasks:
     - name: show_facts_ipv4
       debug:
         var: ansible_facts.dns

④最后用ansible-playbook dns_ip.yml去运行测试这个playbook,结果如下:

 [devops@master chap03]$ ansible-playbook dns_ip.yml
 ​
 PLAY [dns_ip] ******************************************************************
 ​
 TASK [Gathering Facts] *********************************************************
 ok: [node01]
 ok: [node02]
 ok: [master]
 ​
 TASK [show_facts_ipv4] *********************************************************
 ok: [master] => {
     "ansible_facts.dns": {
         "nameservers": [
             "114.114.114.114"
         ]
     }
 }
 ok: [node01] => {
     "ansible_facts.dns": {
         "nameservers": [
             "114.114.114.114"
         ]
     }
 }
 ok: [node02] => {
     "ansible_facts.dns": {
         "nameservers": [
             "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

将example.conf文件复制到/etc/httpd/conf.d/目录,example.conf文件内容如下:

 <virtualhost *:80>
 servername 0.0.0.0
 documentroot /var/www/html
 </virtualhost>
 <directory /var/www/html>
 allowoverride none
 require all granted
 </directory>

如果/etc/httpd/conf.d/目录下的文件更新,则重启httpd服务。配置/var/www/html/index.html文件内容如下:

 zuoye

解答

①先用vim example.conf去写入上述内容

②再用vim copy_vim.yml去编辑copy_vim.yml文件,代码如下:

---
 - name: copy_vim
   hosts: all
   tasks:
     - name: copy conf
       copy:
         src: ./example.conf
         dest: /etc/httpd/conf.d/
       notify: restart httpd
 ​
     - name: install a list of package
       yum:
         name:
           - httpd
           - mariadb-server
           - firewalld
           - php
         state: present
 ​
     - name: define index.html
       copy:
         content: "zuoye\n"
         dest: /var/www/html/index.html
     - name: start httpd
       service:
         name: httpd
         state: started
         
   handlers:
     - name: restart httpd
       service:
         name: httpd
         state: restarted

③然后用ansible-playbook copy_vim.yml去运行测试这个playbook,结果如下:

 [devops@master chap03]$ ansible-playbook copy_vim.yml
 ​
 PLAY [copy_vim] ****************************************************************
 ​
 TASK [Gathering Facts] *********************************************************
 ok: [node01]
 ok: [node02]
 ok: [master]
 ​
 TASK [copy conf] ***************************************************************
 changed: [node01]
 changed: [node02]
 changed: [master]
 ​
 TASK [install a list of package] ***********************************************
 ok: [master]
 ok: [node01]
 ok: [node02]
 ​
 TASK [define index.html] *******************************************************
 changed: [node02]
 changed: [node01]
 changed: [master]
 ​
 TASK [start httpd] *************************************************************
 ok: [node01]
 ok: [node02]
 ok: [master]
 ​
 RUNNING HANDLER [restart httpd] ************************************************
 changed: [node02]
 changed: [node01]
 changed: [master]
 ​
 PLAY RECAP *********************************************************************
 master                     : ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
 node01                     : ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
 node02                     : ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

④最后用ansible all -m command -a 'cat /etc/httpd/conf.d/example.conf'ansible all -m command -a 'cat /var/www/html/index.html'来查询受管主机是否将example.conf文件复制到/etc/httpd/conf.d/目录和是否配置/var/www/html/index.html文件,结果如下:

[devops@master chap03]$ ansible all -m command -a 'cat /etc/httpd/conf.d/example.conf'
 master | CHANGED | rc=0 >>
 <virtualhost *:80>
 servername 0.0.0.0
 documentroot /var/www/html
 </virtualhost>
 ​
 <directory /var/www/html>
 allowoverride none
 require all granted
 </directory>
 node02 | CHANGED | rc=0 >>
 <virtualhost *:80>
 servername 0.0.0.0
 documentroot /var/www/html
 </virtualhost>
 ​
 <directory /var/www/html>
 allowoverride none
 require all granted
 </directory>
 node01 | CHANGED | rc=0 >>
 <virtualhost *:80>
 servername 0.0.0.0
 documentroot /var/www/html
 </virtualhost>
 ​
 <directory /var/www/html>
 allowoverride none
 require all granted
 </directory>
 ​
 [devops@master chap03]$ ansible all -m command -a 'cat /var/www/html/index.html'
 master | CHANGED | rc=0 >>
 zuoye
 node02 | CHANGED | rc=0 >>
 zuoye
 node01 | CHANGED | rc=0 >>
 zuoye

二、ansible的templates的习题

使用file.j2模板文件向受管主机的/home/file文件里面写入上述内容

解答

①先用vim file.j2.yml去编辑file.j2.yml文件,代码如下:

 ---
 - name: file.j2
   hosts: all
   gather_facts: yes
   become: yes
   tasks:
     - name: write /home/file
       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

②再用ansible-playbook file.j2.yml去运行测试file.j2.yml,结果如下:

 [devops@master chap03]$ ansible-playbook file.j2.yml
 ​
 PLAY [file.j2] *******************************************************************
 ​
 TASK [Gathering Facts] *********************************************************
 ok: [node02]
 ok: [master]
 ok: [node01]
 ​
 TASK [write /home/file] ********************************************************
 changed: [node01]
 changed: [node02]
 changed: [master]
 ​
 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

③最后用ansible all -m command -a 'cat /home/file'去查询受管主机是否实现写入题目要求的内容,结果如下:

 [devops@master chap03]$ ansible all -m command -a 'cat /home/file'          
node01 | CHANGED | rc=0 >>
 hostname=node01
 memory=3615MB
 BIOS version=VMW201.00V.24006586.B64.2406042154
 distribution=RedHat 9.3
 Size of disk device is 100.00 GB
 master | CHANGED | rc=0 >>
 hostname=master
 memory=3615MB
 BIOS version=VMW201.00V.24006586.B64.2406042154
 distribution=RedHat 9.3
 Size of disk device is 100.00 GB
 node02 | CHANGED | rc=0 >>
 hostname=node02
 memory=3615MB
 BIOS version=VMW201.00V.24006586.B64.2406042154
 distribution=RedHat 9.3
 Size of disk device is 100.00 GB

三、ansible的流程控制的习题

如果当前受管主机的根分区容量大于1G,则安装httpd和mariadb-server软件包,如果httpd和mariadb服务未运行则运行该服务。

解答

①先用vim test1.yml去编辑test1.yml文件,代码如下:

 ---
 - name: test1
   hosts: all
   tasks:
     - name: install a list of package
       yum:
         name:
           - httpd
           - mariadb-server
         state: present
       when: ansible_facts.devices.sda.size | human_to_bytes > 1073741824
     - name: start httpd
       service:
         name: httpd
         state: started
         enabled: true
       when: ansible_facts.services['httpd.service'].state | default('stopped') != 'running'
     - name: start mariadb
       service:
         name: mariadb
         state: started
         enabled: true
       when: ansible_facts.services['mariadb'].state | default('stopped') != 'running'

②再用ansible-playbook test1.yml去运行测试test1.yml,结果如下:

 [devops@master chap03]$ ansible-playbook test1.yml
 ​
 PLAY [test1] *******************************************************************
 ​
 TASK [Gathering Facts] *********************************************************
 ok: [node01]
 ok: [node02]
 ok: [master]
 ​
 TASK [install a list of package] ***********************************************
 ok: [master]
 ok: [node02]
 ok: [node01]
 ​
 TASK [start httpd] *************************************************************
 ok: [node02]
 ok: [node01]
 ok: [master]
 ​
 TASK [start mariadb] ***********************************************************
 ok: [master]
 ok: [node02]
 ok: [node01]
 ​
 PLAY RECAP *********************************************************************
 master                     : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
 node01                     : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
 node02                     : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

2、创建一个playbook,要求如下:

 该playbook运行在所有受控节点
 该playbook覆盖/etc/message文件的内容
 在dev主机组的主机上,内容是:Development
 在test主机组的主机上,内容是:Test

解答

先用vim inventory.yml去编辑inventory.yml文件,为了分出dev主机组和test主机组,我将master分到了dev主机组,node01和node02分到了test主机组,代码如下:

 master
 node01
 node02
 ​
 [webservers]
 master
 ​
 [dbservers]
 node01
 ​
 [servers:children]
 webservers
 dbservers
 ​
 [dev]
 master
 ​
 [test]
 node01
 node02

②再用vim message.yml去编辑message.yml文件,代码如下:

 ---
 - name: message
   hosts: all
   become: yes
   tasks:
     - name: Set dev
       copy:
         content: "Development\n"
         dest: /etc/message
       when: "'dev' in group_names"
 ​
     - name: Set test
       copy:
         content: "Test\n"
         dest: /etc/message
       when: "'test' in group_names"

③然后用ansible-playbook message.yml去运行测试message.yml,结果如下:

 [devops@master chap03]$ ansible-playbook message.yml                        
 PLAY [message] *****************************************************************
 ​
 TASK [Gathering Facts] *********************************************************
 ok: [node01]
 ok: [master]
 ok: [node02]
 ​
 TASK [Set dev] *****************************************************************
 skipping: [node01]
 skipping: [node02]
 changed: [master]
 ​
 TASK [Set 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

④最后用ansible all -m command -a 'cat /etc/message'去查询受管主机是否实现写入题目要求的内容,结果如下:

 [devops@master chap03]$ ansible all -m command -a 'cat /etc/message'        
​​​​​​​node02 | CHANGED | rc=0 >>
 Test
 node01 | CHANGED | rc=0 >>
 Test
 master | CHANGED | rc=0 >>
 Development
​​​​​​​
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐