一、草创未就
Playbooks 是 Ansible的配置,部署,编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。
二、先睹为快
1、前提条件
node1 (192.168.92.10) ansible管理端
node2 (192.168.92.11) 节点
已将node1的公钥推送至node2
hosts文件中加入websrvs组,加入node2 IP地址
2、开始实验
playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。下面是一个简单示例:
vim nginx.yml
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
上面的示例完成了安装nginx的任务,hosts定义了要安装nginx的主机列表,remote_user定义了远程主机执行的用户,tasks定义了安装的任务名以及相关的操作,这里使用了ansible的常用模块yum,其执行结果如下:
[root@node1 ~]# ansible-playbook nginx.yml
PLAY [websrvs] ************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [192.168.92.11]
TASK [install nginx package] **********************************************************************
changed: [192.168.92.11]
PLAY RECAP ****************************************************************************************
192.168.92.11 : ok=2 changed=1 unreachable=0 failed=0
nginx.yml这个文件是由YAML写成的,- 就是yaml的语法。
3、YAML介绍
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者
YAML的特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
4、YAML的语法
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。
三、由浅入深
通过上述的例子学习了nginx通过playbook来安装,现在我们来让这个剧本可以推送配置文件,并且管理nginx服务。
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: install configuration file for nginx
copy: src=/root/conf/nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx service
service: enabled=true name=nginx state=started
[root@node1 ~]# ansible-playbook nginx.yml
PLAY [websrvs] ************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [192.168.92.11]
TASK [install nginx package] **********************************************************************
ok: [192.168.92.11]
TASK [install configuration file for nginx] *******************************************************
changed: [192.168.92.11]
TASK [start nginx service] ************************************************************************
changed: [192.168.92.11]
PLAY RECAP ****************************************************************************************
192.168.92.11 : ok=4 changed=2 unreachable=0 failed=0
在这个剧本下我们加入了配置文件推送和启动服务的功能,但是这有一个问题,如果在服务是启动的情况下,修改了配置文件,服务不会自行重启或重读配置文件,这种情况该怎么办呢,handlers出现了,handlers用于当关注的资源发生变化时采取一定的操作,下面我们来看看怎么写
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: install configuration file for nginx
copy: src=/root/conf/nginx.conf dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: start nginx service
service: enabled=true name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
这时,如果我们修改了配置文件,playbook就会将nginx重启
[root@node1 ~]# ansible-playbook nginx.yml
PLAY [websrvs] ************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [192.168.92.11]
TASK [install nginx package] **********************************************************************
ok: [192.168.92.11]
TASK [install configuration file for nginx] *******************************************************
changed: [192.168.92.11]
TASK [start nginx service] ************************************************************************
changed: [192.168.92.11]
PLAY RECAP ****************************************************************************************
192.168.92.11 : ok=4 changed=2 unreachable=0 failed=0
现在我们每次改配置文件playbook都会将所有任务都执行一遍,因为playbook幂等性的缘故,不会做什么操作,但我们可以通过tags使其只执行我们想要执行的操作。
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: install configuration file for nginx
copy: src=/root/conf/nginx.conf dest=/etc/nginx/nginx.conf
tags:
- conf
notify:
- restart nginx
- name: start nginx service
service: enabled=true name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
在修改配置文件的task中加入了tags,在只运行修改配置文件区块时,安装操作就不会运行了
[root@node1 ~]# ansible-playbook nginx.yml --tags="conf"
PLAY [websrvs] ************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [192.168.92.11]
TASK [install configuration file for nginx] *******************************************************
changed: [192.168.92.11]
RUNNING HANDLER [restart nginx] *******************************************************************
changed: [192.168.92.11]
PLAY RECAP ****************************************************************************************
192.168.92.11 : ok=3 changed=2 unreachable=0 failed=0