一、草创未就

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