ansible playbook应用

一,ansible的playbook作用

playbook(剧本),顾名思义,就是需要定义一个脚本或者说配置文件,然后定义好做什么。

ansible可以使用playbook灵活的批量执行远程命令,使用roles在playbook中作为模块多次,灵活的调用。

ansilble plabook使用YAML语言

二,YAML语法与范例

##YAML语法与范例

> - YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16
> - 使用**空白字符**(不能使用<kbd>Tab</kbd>)分层,同层元素左侧对齐
> - 单行注解由井字号(<kbd> #</kbd> )开始,可以出现在行中任何位置
> - 每个清单成员以单行表示,并用短杠+空白(<kbd>-  </kbd>)起始
> - 每个杂凑表的成员用冒号+空白(<kbd>:  </kbd>)分开键和值
> - 杂凑表的键值可以用问号 (<kbd>?</kbd>)起始,表示多个词汇组成的键值
> - 字串一般不使用引号,但必要的时候可以用引号框住
> - 使用双引号表示字串时,可用倒斜线(<kbd>\</kbd>)进行特殊字符转义
> - 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号<kbd>|</kbd>)或新行折叠(使用符号<kbd>></kbd>)两种方式
> - 在单一档案中,可用连续三个连字号(<kbd>---</kbd>)区分多个档案
> - 可选择性的连续三个点号(<kbd>...</kbd>)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处)
> - 重复的内容可使从参考标记星号 (<kbd>*</kbd>)复制到锚点标记(<kbd>&</kbd>)
> - 指定格式可以使用两个惊叹号 ( !! ),后面接上名称

注意点:

(1),在YAML中必须使用空格进行缩进,不能使用tab

(2),使用一个跟着空格的“-”符号来声明一个序列。

- hosts

(3),使用一个跟着空格的冒号标记每一个键值对来声明一个散列表。

- hosts: websrc

(4),一个序列可以写成方括号 [] 中逗号分隔的列表形式;

[PHP,Perl,Python]

一个散列表可以写成大括号{}中逗号分隔的键值对列表的形式;

{ PHP: 5.2,MySQL: 5.5,Apache: 2.2.20}

(5),注释加#号


示例1: 安装apache,复制本地配置文件到远程主机,(当配置文件改变的时候触发notify重启httpd)启动httpd服务

vim /etc/ansible/hosts  #定义配置文件

192.168.0.21

[web]

192.168.0.22

192.168.0.23

正常运行:

#ansible-playbook playbook1.yml

仅运行tags

#ansible-playbook playbook1.yml --tags=1

代码:

#playbook1.yml

- hosts: web 

   remote_user: root

   vars:

      - Sname1: httpd

      - Sname2: mysql

   tasks:

        - name: install ` Sname1 ` 

          yum: name=` Sname1 ` state=latest     #使用定义的变量

        - name: copy config file

          tags: 1   #仅运行copy config file,其他忽略。

          copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf

          notify:    #当配置文件改变的时候,触发notify,重启httpd,notify和之上的并列书写。

                - restart httpd

        - name: start httpd

          service: name=httpd state=started

        - name: install  ` Sname2 ` on node3

          yum: name=mysql-server state=latest

          when: ansible_hostname == "node3"    #只给主机名为node3的安装mysql-server,ansible_hostname为(ansible web -m setup获取的变量信息)

        - name: add several users  #迭代,当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可

          user: name={{ item }} state=present groups=wheel

          with_items:

                    - testuser1

                    - testuser2 

   handlers:

        - name: restart httpd

          service: name=httpd state=restarted


三,Templates 的使用(模板的使用)

使用场合:

                在web这个组中 192.168.0.22 和192.168.0.23 ,22需要监听httpd服务为80端口,而23需要监听8080端口,两个端口,最大连接数,主机名都不一样,之前的方法copy本地配置文件,配置文件是一致的,不能实现,所有需要使用Templates。

思路:

1,在模板文件内定义变量。

2,在配置文件主机定义不同主机需要的变量。(这样可以在不同主机匹配到配置文件的时候使用的是不同的值)

3,配置playbook文件

1,在模板文件内定义变量。

#mkdir /templates

#cd /templates

#mv /etc/httpd/conf/httpd.conf ./httpd.conf.j2   #模板文件

#vim httpd.conf.j2

#定义替换的变量:

ServerName {{ ansible_fqdn }}  #setup获取的自定义变量ansible_fqdn

Listen {{ http_port }}

MaxClients       {{ MaxClients }}

2,在配置文件主机定义不同主机需要的变量值

# vim /etc/ansible/hosts

[web]

192.168.0.22 http_port=80 MaxClients=100

192.168.0.23 http_port=8080 MaxClients=200

3,配置playbook文件

L13.1 ansible playbook应用_playbook

四,roles使用

ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在

playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用

于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

所有的文件都放到file目录中,所有的模板都放到templates中,所有的taks都放到taks目录中,下来只是调用即可。

一个roles的案例如下所示:

        site.yml 主调接口

        webservers.yml

        fooservers.yml

        roles/

           common/

             files/

             templates/

             tasks/

             handlers/

             vars/

             meta/

           webservers/

             files/

             templates/

             tasks/

             handlers/

             vars/

             meta/

而在playbook中,可以这样使用roles:

    ---

    - hosts: webservers

      roles:

         - common

         - webservers

    也可以向roles传递参数,例如:

    ---

    - hosts: webservers

      roles:

        - common

        - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }

        - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

    甚至也可以条件式地使用roles,例如:

    ---

    - hosts: webservers

      roles:

        - { role: some_role, when: "ansible_os_family == 'RedHat'" }

1 创建role的步骤

    (1) 创建以roles命名的目录;

    (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;

    (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;

    (4) 在playbook文件中,调用各角色;


2 role内各目录中可用的文件

    tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其它的位于此目录中的task文件;

    files目录:存放由copy或script等模块调用的文件;

    templates目录:template模块会自动在此目录中寻找Jinja2模板文件;

    handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;在handler中使用include包含的其它的handler文件也应该位于此目录中;

    vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;

    meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;ansible 1.3及其以后的版本才支持;

    default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;

示例:

如下,使用playbook将会特别麻烦,不能进行模块话调用。

L13.1 ansible playbook应用_playbook_02

这样可以使用roles来完成以上的部署:

1 创建role的步骤

    (1) 创建以roles命名的目录;

    (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等;

    (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建;

    (4) 在playbook文件中,调用各角色;


部署:

# vim /etc/ansible/hosts

192.168.0.21

[websrvs]

192.168.0.22

192.168.0.23

创建目录结构:web服务和数据库服务

mkdir -pv /ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}

L13.1 ansible playbook应用_应用_03

# cp /etc/httpd/conf/httpd.conf /ansible_playbooks/roles/websrvs/files/    #用httpd.conf作为静态httpd配置文件,放在file目录中

# cd /ansible_playbooks/roles/websrvs/

#vim tasks/main.yml   #定义tasks文件

L13.1 ansible playbook应用_playbook_04# vim handlers/main.yml  #定义handlers

L13.1 ansible playbook应用_ansible_05

#[root@node1 ansible_playbooks]# pwd

/ansible_playbooks

# vim site.yml  定义主要执行的文件

运行结果:

L13.1 ansible playbook应用_应用_06

这样就给两台主机按需做了配置

实现模块化调用:

21 使用角色websrvs

22 使用dbsrvs

23 两个都安装。

# vim /ansible_playbooks/test.yml

L13.1 ansible playbook应用_应用_07

配置dbsrvs

cp /etc/mysql/my.cnf roles/dbsrvs/files/

vim roles/dbsrvs/tasks/main.yml

L13.1 ansible playbook应用_playbook_08

vim roles/dbsrvs/handlers/main.yml

L13.1 ansible playbook应用_playbook_09

[root@node1 ansible_playbooks]# ansible-playbook test.yml   执行

roles:总结

            (1) 目录名同角色名;

            (2) 目录结构有固定格式:

                files: 静态文件

                templates: Jinjia2模板文件

                tasks: 至少有main.yml文件,定义各tasks;

                handlers:至少有一个main.yml文件,定义各handlers

                vars: 至少有一个main.yml文件,定义变量

                meta: 定义依赖关系等信息

            (3) site.yml中定义playbook,额外也可以有其它的yml文件;