# 参考https://www.cnblogs.com/yanjieli/p/10969299.htmlhttps://jeremyxu2010.github.io/2018/03/ansible%E7%AE%80%E6%98%93%E5%85%A5%E9%97%A8%E4%B9%8Bplaybook/#playbooks-
Playbook介绍
Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。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
yum install ansiblecat >/etc/ansible/ansible.cfg << EOF[defaults]inventory = hostshost_key_checking = Falseremote_user = ansibleuser[inventory][privilege_escalation]become=Truebecome_method=sudobecome_user=rootbecome_ask_pass=False[paramiko_connection][ssh_connection][persistent_connection][accelerate][selinux][colors][diff]EOF
简单示例- 安装nginx
# cat /etc/ansible/hosts[dbservers]172.18.15.182172.18.15.183[ansibleuser@node1 ~]$ cat nginx.yml- hosts: dbservers #定义需要执行主机remote_user: ansibleuser #远程用户become: yes #等同于添加 ‘sudo’ 或 ‘su’ ,默认为sudobecome_user: root #sudo用户become_method: sudotasks:- name: Install nginx server packageyum: name=nginx state=present- name: Starting nginx serviceservice: name=nginx state=started[ansibleuser@node1 ~]$[ansibleuser@node1 ~]$ ansible-playbook nginx.ymlPLAY [dbservers] **************************************************************************************************************************************************************************************TASK [Gathering Facts] ********************************************************************************************************************************************************************************ok: [172.18.15.182]ok: [172.18.15.183]TASK [Install nginx server package] *******************************************************************************************************************************************************************changed: [172.18.15.182]changed: [172.18.15.183]TASK [Starting nginx service] *************************************************************************************************************************************************************************changed: [172.18.15.183]changed: [172.18.15.182]PLAY RECAP ********************************************************************************************************************************************************************************************172.18.15.182 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0172.18.15.183 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0[ansibleuser@node1 ~]$
使用ansible-playbook安装 Apache
# 创建playbook文件[root@ansible ~]# cat playbook01.yml--- #固定格式- hosts: 192.168.1.31 #定义需要执行主机remote_user: root #远程用户vars: #定义变量http_port: 8088 #变量tasks: #定义一个任务的开始- name: create new file #定义任务的名称file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情- name: create new useruser: name=test02 system=yes shell=/sbin/nologin- name: install packageyum: name=httpd- name: config httpdtemplate: src=./httpd.conf dest=/etc/httpd/conf/httpd.confnotify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用- restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致- name: copy index.htmlcopy: src=/var/www/html/index.html dest=/var/www/html/index.html- name: start httpdservice: name=httpd state=startedhandlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作- name: restart apache #要与notify定义的内容相同service: name=httpd state=restarted #触发要执行的动作#测试页面准备[root@ansible ~]# echo "<h1>playbook test file</h1>" >>/var/www/html/index.html#配置文件准备[root@ansible ~]# cat httpd.conf |grep ^ListenListen {{ http_port }}#执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok[root@ansible ~]# ansible-playbook playbook01.ymlPLAY [192.168.1.31] *********************************************************************************************TASK [Gathering Facts] ******************************************************************************************ok: [192.168.1.31]TASK [create new file] ******************************************************************************************changed: [192.168.1.31]TASK [create new user] ******************************************************************************************changed: [192.168.1.31]TASK [install package] ******************************************************************************************changed: [192.168.1.31]TASK [config httpd] *********************************************************************************************changed: [192.168.1.31]TASK [copy index.html] ******************************************************************************************changed: [192.168.1.31]TASK [start httpd] **********************************************************************************************changed: [192.168.1.31]PLAY RECAP ******************************************************************************************************192.168.1.31 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0# 验证上面playbook执行的结果[root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'192.168.1.31 | CHANGED | rc=0 >>/tmp/playtest.txtuid=990(test02) gid=985(test02) 组=985(test02)[root@ansible ~]# curl 192.168.1.31:8088<h1>playbook test file</h1>
