1. # 参考
  2. https://www.cnblogs.com/yanjieli/p/10969299.html
  3. https://jeremyxu2010.github.io/2018/03/ansible%E7%AE%80%E6%98%93%E5%85%A5%E9%97%A8%E4%B9%8Bplaybook/#playbooks-

Playbook介绍

Playbookad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstackstate状态文件。ad-hoc无法持久使用,playbook可以持久使用。

playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

Playbook核心元素

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Varniables 内置变量或自定义变量在playbook中调用
  • Templates 模板,即使用模板语法的文件,比如配置文件等
  • Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。

    Playbook语法

    playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。

  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
  • 使用#号注释代码。
  • 缩进必须统一,不能空格和tab混用。
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可以换行写。同行使用:分隔。
  • v可以是个字符串,也可以是一个列表
  • 一个完整的代码块功能需要最少元素包括 name: task<br />

安装ansible

  1. yum install ansible
  2. cat >/etc/ansible/ansible.cfg << EOF
  3. [defaults]
  4. inventory = hosts
  5. host_key_checking = False
  6. remote_user = ansibleuser
  7. [inventory]
  8. [privilege_escalation]
  9. become=True
  10. become_method=sudo
  11. become_user=root
  12. become_ask_pass=False
  13. [paramiko_connection]
  14. [ssh_connection]
  15. [persistent_connection]
  16. [accelerate]
  17. [selinux]
  18. [colors]
  19. [diff]
  20. EOF

简单示例- 安装nginx

  1. # cat /etc/ansible/hosts
  2. [dbservers]
  3. 172.18.15.182
  4. 172.18.15.183
  5. [ansibleuser@node1 ~]$ cat nginx.yml
  6. - hosts: dbservers #定义需要执行主机
  7. remote_user: ansibleuser #远程用户
  8. become: yes #等同于添加 ‘sudo’ 或 ‘su’ ,默认为sudo
  9. become_user: root #sudo用户
  10. become_method: sudo
  11. tasks:
  12. - name: Install nginx server package
  13. yum: name=nginx state=present
  14. - name: Starting nginx service
  15. service: name=nginx state=started
  16. [ansibleuser@node1 ~]$
  17. [ansibleuser@node1 ~]$ ansible-playbook nginx.yml
  18. PLAY [dbservers] **************************************************************************************************************************************************************************************
  19. TASK [Gathering Facts] ********************************************************************************************************************************************************************************
  20. ok: [172.18.15.182]
  21. ok: [172.18.15.183]
  22. TASK [Install nginx server package] *******************************************************************************************************************************************************************
  23. changed: [172.18.15.182]
  24. changed: [172.18.15.183]
  25. TASK [Starting nginx service] *************************************************************************************************************************************************************************
  26. changed: [172.18.15.183]
  27. changed: [172.18.15.182]
  28. PLAY RECAP ********************************************************************************************************************************************************************************************
  29. 172.18.15.182 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  30. 172.18.15.183 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  31. [ansibleuser@node1 ~]$

使用ansible-playbook安装 Apache

  1. # 创建playbook文件
  2. [root@ansible ~]# cat playbook01.yml
  3. --- #固定格式
  4. - hosts: 192.168.1.31 #定义需要执行主机
  5. remote_user: root #远程用户
  6. vars: #定义变量
  7. http_port: 8088 #变量
  8. tasks: #定义一个任务的开始
  9. - name: create new file #定义任务的名称
  10. file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情
  11. - name: create new user
  12. user: name=test02 system=yes shell=/sbin/nologin
  13. - name: install package
  14. yum: name=httpd
  15. - name: config httpd
  16. template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
  17. notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
  18. - restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致
  19. - name: copy index.html
  20. copy: src=/var/www/html/index.html dest=/var/www/html/index.html
  21. - name: start httpd
  22. service: name=httpd state=started
  23. handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作
  24. - name: restart apache #要与notify定义的内容相同
  25. service: name=httpd state=restarted #触发要执行的动作
  26. #测试页面准备
  27. [root@ansible ~]# echo "<h1>playbook test file</h1>" >>/var/www/html/index.html
  28. #配置文件准备
  29. [root@ansible ~]# cat httpd.conf |grep ^Listen
  30. Listen {{ http_port }}
  31. #执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
  32. [root@ansible ~]# ansible-playbook playbook01.yml
  33. PLAY [192.168.1.31] *********************************************************************************************
  34. TASK [Gathering Facts] ******************************************************************************************
  35. ok: [192.168.1.31]
  36. TASK [create new file] ******************************************************************************************
  37. changed: [192.168.1.31]
  38. TASK [create new user] ******************************************************************************************
  39. changed: [192.168.1.31]
  40. TASK [install package] ******************************************************************************************
  41. changed: [192.168.1.31]
  42. TASK [config httpd] *********************************************************************************************
  43. changed: [192.168.1.31]
  44. TASK [copy index.html] ******************************************************************************************
  45. changed: [192.168.1.31]
  46. TASK [start httpd] **********************************************************************************************
  47. changed: [192.168.1.31]
  48. PLAY RECAP ******************************************************************************************************
  49. 192.168.1.31 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  50. # 验证上面playbook执行的结果
  51. [root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
  52. 192.168.1.31 | CHANGED | rc=0 >>
  53. /tmp/playtest.txt
  54. uid=990(test02) gid=985(test02) 组=985(test02)
  55. [root@ansible ~]# curl 192.168.1.31:8088
  56. <h1>playbook test file</h1>