playbook剧本



文章目录

  • playbook剧本
  • 补充:template模块
  • YAML语法和playbook写法
  • 初步说明
  • playbook的内容
  • YAML字典
  • playbook的使用
  • 实例


补充:template模块

1、template模块的使用方法和copy模块基本一致,但是copy模块从本地ansible节点复制文件到受控节点时,源文件的内容是什么就是什么,不能发生改变;而使用template模块复制文件时,源文件的内容可以随着受控主机的不同而发生变化。

2、使用template模块复制文件时,该文件的扩展名必须为“.j2”。

例题1:创建模板文件html.j2,该文件的内容为
The 【受控主机的hostname】 address is 【IP地址】(需要随着受控主机的不同,文件的内容而发生变化)

1、编辑文件html.j2
[root@server ansible]# cat html.j2 
the {{ansible_fqdn}} address is {{ansible_ens160.ipv4.address}}

2、撰写playbook,将模板文件复制到受控主机的/tmp/目录下,并重命名为html
 [root@server ansible]# vim a.yml
  - name: test
  hosts: node1,node2
  tasks:
    - name: cp html.j2
      template:
        src: /etc/ansible/html.j2
        dest: /tmp/html

3、执行该playbook
Ansible-playbook  a.yml

4、分别去node1和node2两台受控主机中去验证
Node1: 
[root@node1 ~]# cat /tmp/html 
the node1.example.com address is 172.16.30.10
[root@node1 ~]# 

Node2:
[root@node2 ~]# cat /tmp/html 
the node2.example.com address is 172.16.30.20
[root@node2 ~]#

例题2:
Copy模块:
创建一个名为/etc/ansible/b.yml的playbook
该playbook在所有的清单主机中运行
该playbook的内容为:
如果将受控主机的/tmp/chenyu文件的内容替换成如下:
在net主机组中的主机上,这行文本显示:wangyani
在hr主机组中的主机上,这行文本显示:wyn123

[root@server ansible]# cat hosts
[net]
node1

[hr]
node2

1、撰写剧本
[root@server ansible]# vim b.yml
- name: test
  hosts: all
  tasks:
    - name: cp file
      copy:
        content: |
          {% if "net" in group_names %}
          chenyu
          {% elif "hr" in group_names %}
          cy123
          {% endif %}
        dest: /tmp/chenyu

2、执行该剧本
Ansible-playbook  b.yml

3、验证:
Node1:
[root@node1 ~]# cat /tmp/wangyani 
wangyani
[root@node1 ~]# 

Node2:
[root@node2 ~]# cat /tmp/wangyani 
wyn123
[root@node2 ~]#

YAML语法和playbook写法

ansible的playbook采用了yaml语法,它简单地实现了json格式的事件描述。在学习ansible playbook之前,很有必要把yaml的语法格式、引用方式做个梳理。

初步说明

以一个简单的playbook为例,说明yaml的基本语法

ansible playbook 替换文件_vim

  1. yaml⽂件以 — 开头,以表明这是⼀个yaml⽂件,就像xml⽂件在开头使⽤ <?xml version="1.0" encoding="utf-8"?> 宣称它是xml⽂件⼀样。但即使没有使⽤ — 开头,也不会有什么影响。
  2. yaml中使⽤"#“作为注释符,可以注释整⾏,也可以注释⾏内从”#"开始的内容。
  3. yaml中的字符串通常不⽤加任何引号,即使它包含了某些特殊字符。但有些情况下,必须加引号,最常见的是在引⽤变量的时候。
  4. 关于布尔值的书写格式,即true/false的表达⽅式。其实playbook中的布尔值类型⾮常灵活,可分为两种情况:
    模块的参数: 这时布尔值作为字符串被ansible解析。接受yes/on/1/true/no/of f /0/false,这时被ansible解析。例如上⾯⽰例中的 update_cache=yes 。

⾮模块的参数: 这时布尔值被yaml解释器解析,完全遵循yaml语法。接受不区分⼤⼩写的 true/yes/on/y/f alse/no/off /n。例如上⾯的 gpgcheck=no 和 enabled=True 。建议遵循ansible的官⽅规范,模块的布尔参数采⽤yes/no,⾮模块的布尔参数采⽤True/False

playbook的内容

每个play都包含⼀个hosts和⼀个tasks,hosts定义的是inventory中待控制的主机,tasks下定义的是⼀系列task任务列表,⽐如调⽤各个模块。这些task按顺序⼀次执⾏⼀个,直到所有被筛选出来的主机都执⾏了这个task之后才会移动到下⼀个task上进⾏同样的操作。
需要注意的是,虽然只有被筛选出来的主机会执⾏对应的task,但是所有主机(此处的所有主机表⽰的是,hosts选项所指定的那些主机)都会收到相同的task指令,所有主机收到指令后,ansible主控端会筛选某些主机,并通过ssh在远程执⾏任务。

YAML字典

YAML中使用的key/value对也称为字典、散列或关联数组 在key/value对中,键与值通过由冒号和空格组成的分隔符隔开 name: svcrole svcservice: http svcport: 80 字典也可以使用内嵌块格式表示,其中多个key/value对用花括号括起,并由逗号和空格隔开 - {name: svcrole, svcservice: http, svcport: 80} YAML列表
在YAML中,列表类似于其他编程语言中的数组 为表示一组列表项,使用一个短划线加一个空格作为每个列表项的前缀 hosts: - server1 - server2 列表也可使用内嵌块表示,其中多个列表项用方括号括起来并由逗号和空格隔开 hosts: [server1, server2]

playbook的使用

ansible-playbook用于运行剧本,-C 测试运行结果,并不是真的执行任务。

实例

一、部署web服务器
1、部署yum仓库
2、安装httpd
3、新建/www目录
4、在/www中新建index.html,内容为my name is chenyu(chenyu为你们自己名字的全拼)
5、该web服务器的DocumentRoot为/www
5、实现在ansible中能够使用http://node1访问到该网页内容

[student@server ansible]$ vim web.yml
---
- name: build web
  hosts: node1
  tasks:
    - name: mount cdrom
       mount:
         path: /mnt
         src: /dev/sr0
         fstype: iso9660
         state: mounted

    - name: yum_repo
      yum_repository:
        name: BaseOS
        description: yy
        baseurl: file:///mnt/BaseOS
        enabled: yes
        gpgcheck: no

    - name: yum_repo2
      yum_repository:
        name: AppStream
        description: zz
        baseurl: file:///mnt/AppStream
        enabled: yes
        gpgcheck: no
        
    - name: install httpd
      yum:
        name: httpd
        state: latest

    - name: create /www
      file:
        src: /var/www/html
        dest: /www
        state: link
        mode: 0755

    - name: create index.html
      copy:
        content: "my name is wyn\n"
        dest: /www/index.html 
             
    - name: context
      sefcontext:
        target: /www/index.html
        setype: httpd_sys_content_t
        state: present

    - name: restorecon
      command: restorecon -Rv /www/index.html

    - name: httpd.conf
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: 'DocumentRoot "/var/www/html"'
        replace: 'DocumentRoot "/www"'

    - name: httpd.conf1
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: <Directory "/var/www">
        replace: <Directory "/www">

    - name: restart httpd
      service:
        name: httpd
        state: restarted
        enabled: yes
[student@server ansible]$ ansible-playbook web.yml
PLAY [build web] *******************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [node1]

TASK [mount media] *****************************************************************************************************************************************************
ok: [node1]

TASK [yum_repo] ********************************************************************************************************************************************************
ok: [node1]

TASK [yum_repo2] *******************************************************************************************************************************************************
ok: [node1]

TASK [install httpd] ***************************************************************************************************************************************************
ok: [node1]

TASK [create /wwww] ****************************************************************************************************************************************************
ok: [node1]

TASK [create index.html] ***********************************************************************************************************************************************
ok: [node1]

TASK [httpd.conf] ******************************************************************************************************************************************************
changed: [node1]

TASK [httpd.conf1] *****************************************************************************************************************************************************
changed: [node1]

TASK [restart httpd] ***************************************************************************************************************************************************
changed: [node1]

PLAY RECAP *************************************************************************************************************************************************************
node1                      : ok=10   changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
 
//在ansible访问node1
[student@ansible ansible]$ curl http://node1
my name is wyn

二、使用notify…handlers
1、写一个剧本runtime.yml,只对node1操作
2、创建用户aa,该用户不能用于登录,家目录/www
3、在/www创建一个文件html
4、每次执行该剧本时,将系统的当前时间输入到html文件中。
5、如果html中的时间发生变化,那么创建/tmp/kk的文件

[student@server ansible]$ vim runtime.yml
---
- name: create file
  hosts: node1
  tasks:
    - name: create user
      user:
        name: nn
        shell: /sbin/nologin 
        home: /www
        state: present
        
    - name: create html
      file:
        path: /www/html
        state: touch
        
    - name: date
      shell: date > /www/html
      notify:
        - kk  
          
  handlers:
    - name: kk
      file:
        path: /tmp/kk
        state: touch

[student@server ansible]$ ansible-playbook runtime.yml

PLAY [create file] ********************************************************************

TASK [Gathering Facts] ****************************************************************
ok: [node1]

TASK [create user] ********************************************************************
changed: [node1]

TASK [create html] ********************************************************************
changed: [node1]

TASK [date] ***************************************************************************
changed: [node1]

RUNNING HANDLER [kk] ******************************************************************
changed: [node1]

PLAY RECAP ****************************************************************************
node1                      : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0