导读:我们已经写了两篇关于 Ansible 的文章,这是第三篇。                           
本文字数:9100,阅读时长大约:10分钟
https://linux.cn/article-13167-1.html

作者:Magesh Maruthamuthu
译者:MjSeven
我们已经写了两篇关于 Ansible 的文章,这是第三篇。
如果你是 Ansible 新手,我建议你阅读下面这两篇文章,它会教你一些 Ansible 的基础以及它是什么。
◈ 第一篇: Ansible 自动化工具安装、配置和快速入门指南
◈ 第二篇: Ansible 点对点命令快速入门指南示例
如果你已经阅读过了,那么在阅读本文时你才不会感到突兀。
什么是 Ansible 剧本?
剧本(playbook)比点对点命令模式更强大,而且完全不同。
它使用了 /usr/bin/ansible-playbook 二进制文件,并且提供丰富的特性使得复杂的任务变得更容易。
如果你想经常运行一个任务,剧本是非常有用的。此外,如果你想在服务器组上执行多个任务,它也是非常有用的。
剧本是由 YAML 语言编写。YAML 代表一种标记语言,它比其它常见的数据格式(如 XML 或 JSON)更容易读写。
下面这张 Ansible 剧本流程图将告诉你它的详细结构。
理解 Ansible 剧本的术语
◈ 控制节点(Control node):Ansible 安装的机器,它负责管理客户端节点。
◈ 受控节点(Managed node):控制节点管理的主机列表。
◈ 剧本(playbook):一个剧本文件包含一组自动化任务。
◈ 主机清单(Inventory):这个文件包含有关管理的服务器的信息。
◈ 任务(Task):每个剧本都有大量的任务。任务在指定机器上依次执行(一个主机或多个主机)。
◈ 模块(Module):模块是一个代码单元,用于从客户端节点收集信息。
◈ 角色(Role):角色是根据已知文件结构自动加载一些变量文件、任务和处理程序的方法。
◈ 动作(Play):每个剧本含有大量的动作,一个动作从头到尾执行一个特定的自动化。
◈ 处理程序(Handler):它可以帮助你减少在剧本中的重启任务。处理程序任务列表实际上与常规任务没有什么不同,更改由通知程序通知。如果处理程序没有收到任何通知,它将不起作用。
基本的剧本是怎样的?
下面是一个剧本的模板:
  1. ---[YAML 文件应该以三个破折号开头]
  2. - name:[脚本描述]
  3. hosts: group [添加主机或主机组]
  4. become:true[如果你想以 root 身份运行任务,则标记它]
  5. tasks:[你想在任务下执行什么动作]
  6. - name:[输入模块选项]
  7. module:[输入要执行的模块]
  8. module_options-1: value [输入模块选项]
  9. module_options-2: value
  10. .
  11. module_options-N: value
如何理解 Ansible 的输出
Ansible 剧本的输出有四种颜色,下面是具体含义:
◈ 绿色ok 代表成功,关联的任务数据已经存在,并且已经根据需要进行了配置。
◈ 黄色changed 指定的数据已经根据任务的需要更新或修改。
◈ 红色FAILED 如果在执行任务时出现任何问题,它将返回一个失败消息,它可能是任何东西,你需要相应地修复它。
◈ 白色:表示有多个参数。
为此,创建一个剧本目录,将它们都放在同一个地方。
  1. $ sudomkdir/etc/ansible/playbooks
剧本-1:在 RHEL 系统上安装 Apache Web 服务器
这个示例剧本允许你在指定的目标机器上安装 Apache Web 服务器:
  1. $ sudonano/etc/ansible/playbooks/apache.yml
  2. ---
  3. - hosts: web
  4. become:yes
  5. name:"Install and Configure Apache Web server"
  6. tasks:
  7. - name:"Install Apache Web Server"
  8. yum:
  9. name: httpd
  10. state: latest
  11. - name:"Ensure Apache Web Server is Running"
  12. service:
  13. name: httpd
  14. state: started
  1. $ ansible-playbook apache1.yml
如何理解 Ansible 中剧本的执行
使用以下命令来查看语法错误。如果没有发现错误,它只显示剧本文件名。如果它检测到任何错误,你将得到一个如下所示的错误,但内容可能根据你的输入文件而有所不同。
  1. $ ansible-playbook apache1.yml --syntax-check
  2. ERROR!SyntaxErrorwhile loading YAML.
  3. found a tab character that violate indentation
  4. The error appears to be in'/etc/ansible/playbooks/apache1.yml': line 10, column 1, but may
  5. be elsewhere in the file depending on the exact syntax problem.
  6. The offending line appears to be:
  7. state: latest
  8. ^ here
  9. There appears to be a tab character at the start of the line.
  10. YAML does notuse tabs for formatting.Tabs should be replaced with spaces.
  11. For example:
  12. - name: update tooling
  13. vars:
  14. version:1.2.3
  15. #^--- there is a tab there.
  16. Should be written as:
  17. - name: update tooling
  18. vars:
  19. version:1.2.3
  20. #^--- all spaces here.
或者,你可以使用这个 URL YAML Lint 在线检查 Ansible 剧本内容。
执行以下命令进行“演练”。当你运行带有 --check 选项的剧本时,它不会对远程机器进行任何修改。相反,它会告诉你它将要做什么改变但不是真的执行。
  1. $ ansible-playbook apache.yml --check
  2. PLAY [InstallandConfigureApacheWebserver]********************************************************************
  3. TASK [GatheringFacts]*******************************************************************************************
  4. ok:[node2.2g.lab]
  5. ok:[node1.2g.lab]
  6. TASK [InstallApacheWebServer]*********************************************************************************
  7. changed:[node2.2g.lab]
  8. changed:[node1.2g.lab]
  9. TASK [EnsureApacheWebServerisRunning]***********************************************************************
  10. changed:[node1.2g.lab]
  11. changed:[node2.2g.lab]
  12. PLAY RECAP *******************************************************************************************************
  13. node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  14. node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如果你想要知道 ansible 剧本实现的详细信息,使用 -vv 选项,它会展示如何收集这些信息。
  1. $ ansible-playbook apache.yml --check -vv
  2. ansible-playbook 2.9.2
  3. config file=/etc/ansible/ansible.cfg
  4. configured module search path =['/home/daygeek/.ansible/plugins/modules','/usr/share/ansible/plugins/modules']
  5. ansible python module location =/usr/lib/python3.8/site-packages/ansible
  6. executable location =/usr/bin/ansible-playbook
  7. python version =3.8.1(default,Jan82020,23:09:20)[GCC 9.2.0]
  8. Using/etc/ansible/ansible.cfg as config file
  9. PLAYBOOK: apache.yml *****************************************************************************************************
  10. 1 plays in apache.yml
  11. PLAY [InstallandConfigureApacheWebserver]****************************************************************************
  12. TASK [GatheringFacts]***************************************************************************************************
  13. task path:/etc/ansible/playbooks/apache.yml:2
  14. ok:[node2.2g.lab]
  15. ok:[node1.2g.lab]
  16. META: ran handlers
  17. TASK [InstallApacheWebServer]*****************************************************************************************
  18. task path:/etc/ansible/playbooks/apache.yml:6
  19. changed:[node2.2g.lab]=>{"changed":true,"msg":"Check mode: No changes made, but would have if not in check mod
  20. e","rc":0,"results":["Installed: httpd"]}
  21. changed:[node1.2g.lab]=>{"changed":true,"changes":{"installed":["httpd"],"updated":[]},"msg":"","obsolet
  22. es":{"urw-fonts":{"dist":"noarch","repo":"@anaconda","version":"2.4-16.el7"}},"rc":0,"results":[]}
  23. TASK [EnsureApacheWebServerisRunning]*******************************************************************************
  24. task path:/etc/ansible/playbooks/apache.yml:10
  25. changed:[node1.2g.lab]=>{"changed":true,"msg":"Service httpd not found on host, assuming it will exist on full run"}
  26. changed:[node2.2g.lab]=>{"changed":true,"msg":"Service httpd not found on host, assuming it will exist on full run"}
  27. META: ran handlers
  28. META: ran handlers
  29. PLAY RECAP ***************************************************************************************************************
  30. node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  31. node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
剧本-2:在 Ubuntu 系统上安装 Apache Web 服务器
这个示例剧本允许你在指定的目标节点上安装 Apache Web 服务器。
  1. $ sudonano/etc/ansible/playbooks/apache-ubuntu.yml
  2. ---
  3. - hosts: web
  4. become:yes
  5. name:"Install and Configure Apache Web Server"
  6. tasks:
  7. - name:"Install Apache Web Server"
  8. yum:
  9. name: apache2
  10. state: latest
  11. - name:"Start the Apache Web Server"
  12. service:
  13. name: apaceh2
  14. state: started
  15. - name:"Enable mod_rewrite module"
  16. apache2_module:
  17. name: rewrite
  18. state: present
  19. notify:
  20. - start apache
  21. handlers:
  22. - name:"Ensure Apache Web Server is Running"
  23. service:
  24. name: apache2
  25. state: restarted
  26. enabled:yes
剧本-3:在 Red Hat 系统上安装软件包列表
这个示例剧本允许你在指定的目标节点上安装软件包。
方法-1:
  1. $ sudonano/etc/ansible/playbooks/packages-redhat.yml
  2. ---
  3. - hosts: web
  4. become:yes
  5. name:"Install a List of Packages on Red Hat Based System"
  6. tasks:
  7. - name:"Installing a list of packages"
  8. yum:
  9. name:
  10. - curl
  11. - httpd
  12. -nano
  13. -htop
方法-2:
  1. $ sudonano/etc/ansible/playbooks/packages-redhat-1.yml
  2. ---
  3. - hosts: web
  4. become:yes
  5. name:"Install a List of Packages on Red Hat Based System"
  6. tasks:
  7. - name:"Installing a list of packages"
  8. yum: name={{ item }} state=latest
  9. with_items:
  10. - curl
  11. - httpd
  12. -nano
  13. -htop
方法-3:使用数组变量
  1. $ sudonano/etc/ansible/playbooks/packages-redhat-2.yml
  2. ---
  3. - hosts: web
  4. become:yes
  5. name:"Install a List of Packages on Red Hat Based System"
  6. vars:
  7. packages:['curl','git','htop']
  8. tasks:
  9. - name:Install a list of packages
  10. yum: name={{ item }} state=latest
  11. with_items:"{{ packages }}"
剧本-4:在 Linux 系统上安装更新
这个示例剧本允许你在基于 Red Hat 或 Debian 的 Linux 系统上安装更新。
  1. $ sudonano/etc/ansible/playbooks/security-update.yml
  2. ---
  3. - hosts: web
  4. become:yes
  5. name:"Install Security Update"
  6. tasks:
  7. - name:"Installing Security Update on Red Hat Based System"
  8. yum: name=* update_cache=yes security=yes state=latest
  9. when: ansible_facts['distribution']=="CentOS"
  10. - name:"Installing Security Update on Ubuntu Based System"
  11. apt: upgrade=dist update_cache=yes
  12. when: ansible_facts['distribution']=="Ubuntu"

作者:Magesh Maruthamuthu 选题:lujun9972 译者:MjSeven 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出
欢迎遵照 CC-BY-NC-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。
继续阅读
阅读原文