Ansible之Playbook

本文详细介绍了Ansible Playbook的基础概念和核心元素,包括Playbook的用途、语法、运行方式以及剧本中的元素属性。通过实例展示了如何定义主机与用户、任务列表、触发器、变量使用、标签管理和模板操作。内容涵盖了从简单的文件管理到复杂的配置文件动态生成,深入浅出地解释了如何利用Ansible Playbook进行高效自动化运维。
摘要由CSDN通过智能技术生成

一、Playbook概述

(1)Playbook简介

  • Playbook又叫做剧本,Playbook与ad-hoc相比,是一种完全不同的允许ansible的方式,类似于shell脚本。ad-hoc无法持久使用,而playbook可以持久使用

  • playbook是由一个或者多个play组成的列表,play的主要功能是在于将事先归并为一组的主机,装扮成事先通过ansible中的task定义好的角色,从根本上来讲,所谓的task无非就是调用ansible的一个模块,将多个play组织在一个playbook中,最终的目的是让它们联合起来按照事先编排的机制完成某一个任务

  • playbook可以指定主机组,指定的主机组会执行task,而task就是调用多个ansible的模块,这个类似于shell的脚本

(2)Playbook核心元素

  • Hosts执行的远程主机的列表,可以指定多个主机组
  • Tasks任务集,任务集中会调用各种ansible模块
  • Variables内置变量或者自定义变量在playbook中调用
  • Templates模板,使用模板语法的文件,比如配置文件,以.conf结尾的文件是无法直接调用变量的,但是使用模板语法的文件可以直接调用变量
  • Handlers和notity结合使用,即触发器和动作,由特定的条件触发的操作,满足条件才会执行,否则不执行
  • tags标签,tasks任务集中每次调用模块都可以写一个标签,用户可以通过标签来执行单条命令,因为playbook默认是全部执行的

(3)Playbook语法

  • playbook使用yaml语法格式,所以文件后缀为.yaml或者.yml

  • 剧本的语法规则

    1. 每个play开头都需要打—,也可以使用…来表示play的结尾,也可以省略

    2. 在第二行开始正常写剧本的内容,一般都会写上该剧本的功能

    3. 使用#可以注释代码

    4. 缩进必须统一,不能和空格、tab混用

    5. 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的

    6. YAML文件内容和Linux系统大小写判断方式一致,是区分大小写的,字典中key和value的值都需要区分大小写

    7. 字典中的key和value可以同行写也可以换行写,同行写使用”:“来分割

    8. 和python一样,字典中的value的值可以是字符串也可以是列表

    9. 一个完整的代码块功能至少需要两个元素,分别是name和task

(4)剧本格式示例

[root@ansible ~]# vim /etc/ansible/hosts   #修改hosts文件
。。。。。。
[web]
192.168.100.203
[data]
192.168.100.204
#保存退出

[root@ansible ~]# vim playbook.yaml  #编写剧本
---
- hosts: web
  remote_user: root
  vars:
    http_port: 8080
  tasks:
  - name: 使用yum安装httpd
    yum: name=httpd  state=installed
  - name: 启动httpd
    service: name=httpd state=started
  - name: 编写httpd网页
    copy: content="192.168.100.203" dest=/var/www/html/index.html

- hosts: data
  remote_user: root
  tasks:
  - name: 在root下创建一个aaa.txt文件
    file: path=/root/aaa.txt state=touch
  - name: 往aaa.txt文件中写入内容
    copy: content="aaaaaaaaaaaa" dest=/root/aaa.txt

[root@ansible ~]# ansible-playbook -C playbook.yaml  #执行剧本前先使用-C监测是否有问题

PLAY [web] ******************************************************************************************************************************

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

TASK [使用yum安装httpd] *********************************************************************************************************************
changed: [192.168.100.203]

TASK [启动httpd] **************************************************************************************************************************
changed: [192.168.100.203]

TASK [编写httpd网页] ************************************************************************************************************************
changed: [192.168.100.203]

PLAY [data] *****************************************************************************************************************************

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

TASK [在root下创建一个aaa.txt文件] **************************************************************************************************************
changed: [192.168.100.204]

TASK [往aaa.txt文件中写入内容] ******************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=4    changed=3    unreachable=0    failed=0   
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  playbook.yaml      #执行剧本

PLAY [web] ******************************************************************************************************************************

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

TASK [使用yum安装httpd] *********************************************************************************************************************
changed: [192.168.100.203]

TASK [启动httpd] **************************************************************************************************************************
changed: [192.168.100.203]

TASK [编写httpd网页] ************************************************************************************************************************
changed: [192.168.100.203]

PLAY [data] *****************************************************************************************************************************

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

TASK [在root下创建一个aaa.txt文件] **************************************************************************************************************
changed: [192.168.100.204]

TASK [往aaa.txt文件中写入内容] ******************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=4    changed=3    unreachable=0    failed=0   
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

剧本中可以自定义变量,但是引用到文件的话是需要使用jinjia2模板的

[root@node1 ~]# scp /etc/httpd/conf/httpd.conf  root@192.168.100.202:/root  #先把203上的配置文件传到ansible主机上

[root@ansible ~]# mv httpd.conf httpd.conf.j2  #修改名称
[root@ansible ~]# vim httpd.conf.j2  #修改文件内容
。。。。。。
42 Listen {{ http_port }}    #想要使用变量就需要使用两个{}括起来,中间写变量名称
。。。。。。
#保存退出
[root@ansible ~]# vim playbook02.yaml #写一个新的剧本
---
- hosts: web
  remote_user: root
  vars:
    http_port: 8080

  tasks:
  - name: 复制httpd的主配置文件
    template: src=/root/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  - name: 重新启动httpd
    service: name=httpd state=restarted
#保存退出
[root@ansible ~]# ansible-playbook -C playbook02.yaml   #监测剧本是否有问题

PLAY [web] ******************************************************************************************************************************

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

TASK [复制httpd的主配置文件] ********************************************************************************************************************
changed: [192.168.100.203]

TASK [重新启动httpd] ************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=3    changed=2    unreachable=0    failed=0   

[root@ansible ~]# ansible-playbook playbook02.yaml  #执行剧本
PLAY [web] ******************************************************************************************************************************

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

TASK [复制httpd的主配置文件] ********************************************************************************************************************
changed: [192.168.100.203]

TASK [重新启动httpd] ************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=3    changed=2    unreachable=0    failed=0   
[root@ansible ~]# curl 192.168.100.203:8080   #验证效果
192.168.100.203
[root@ansible ~]# ansible 192.168.100.204 -m shell -a 'cat /root/aaa.txt'
192.168.100.204 | SUCCESS | rc=0 >>
aaaaaaaaaaaa

(5)Playbook的运行方式

[root@ansible ~]# ansible-playbook -h  #查看帮助信息
#ansible-playbook常用选项:
--check 或者 -C   #监测剧本是否有问题,不会真正进行操作
--list-hosts      #列出剧本中要执行任务的主机
--list-tags       #列出剧本中所有定义的标签
--list-tasks      #列出剧本中定义的所有任务集
--limit           #主机列表,只针对主机列表中的某个主机或者某个组执行
-f                #指定并发数,默认为5个
-t                #指定标签运行,运行某一个或多个标签,前提是剧本中有定义标签
-v                #显示过程,使用vv和vvv会更加详细

二、剧本中的元素属性

-主机与用户

  • 在一个剧本开始时,最先定义的是要操作的主机和用户

  • 标准格式:

---                     #固定格式
- hosts: web            #指定主机组或者主机,主机的话写ip就行
  remote_user: root     #指定使用远程主机的那个用户执行剧本的任务
  • 也可以在某一个tasks中定义执行该任务的远程用户
  tasks:
  - name: 测试
    remote_user: aaa  #指定执行用户为aaa
    shell: pwd
  • 使用sudo授权用户执行任务
  tasks:
  - name: 测试
    remote_user: aaa  #指定执行用户为aaa
    sudo: yes         #表示使用sudo授权
    shell: pwd

-tasks任务列表

  • 每一个task必须有一个名称name,这样在运行playbook的时候,从其输出的任务执行信息中可以很清楚的辨别该任务是属于哪一个task的,如果没有定义name,action的值将会用做输出信息中标记对应的task
  • 每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,比如创建一个用户或者安装一个软件等,在hosts中定义的主机或者主机组都将会执行该hosts对应的task任务列表
tasks:
- name: create new file      #创建aaa文件
  file: path=/opt/aaa state=touch
- name: create new user      #创建新用户aaa
  user: name=abc state=present

-Handlers动作与Notify触发

  • 很多时候当某一个配置发现改变时,通常需要重启服务,例如httpd的主配置文件发生改变了,就需要重启服务使配置生效,而这个时候在剧本中就可以用handlers和notify做一个“触发器”,一旦httpd的主配置文件发生改变,就会触发,然后进行动作,重启服务
[root@ansible ~]# vim playnook01.yaml  #编写剧本
---
#这是一个用于安装httpd的剧本
- hosts: web
  remote_user: root
  tasks:
  - name: 安装httpd
    yum: name=httpd state=installed
  - name: 修改配置文件
    template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:             #触发
      - restart httpd   #这个触发的名称是自定义的,表示这个触发的名称是restart httpd 
  - name: 启动httpd
    service: name=httpd state=started
  handlers:             #动作
    - name: restart httpd   #这个名称就是上面的名称,也就是指定restart httpd执行什么命令
      service: name=httpd state=restarted      #添加执行的命令
#保存退出
[root@ansible ~]# sed -i "s/80/8080/g" httpd.conf  #把主配置文件的端口修改为8080,这个配置文件可以先在远程主机上安装复制过来后在使用yum -y remove 删除httpd
[root@ansible ~]# ansible-playbook -C playnook01.yaml  #监测一下写好的剧本有没有问题

PLAY [web] ******************************************************************************************************************************

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

TASK [安装httpd] **************************************************************************************************************************
changed: [192.168.100.203]

TASK [修改配置文件] ***************************************************************************************************************************
changed: [192.168.100.203]

TASK [启动httpd] **************************************************************************************************************************
changed: [192.168.100.203]

RUNNING HANDLER [restart httpd] *********************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=5    changed=4    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  playnook01.yaml   #执行剧本

PLAY [web] ******************************************************************************************************************************

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

TASK [安装httpd] **************************************************************************************************************************
ok: [192.168.100.203]

TASK [修改配置文件] ***************************************************************************************************************************
changed: [192.168.100.203]

TASK [启动httpd] **************************************************************************************************************************
changed: [192.168.100.203]

RUNNING HANDLER [restart httpd] *********************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=5    changed=3    unreachable=0    failed=0     #成功执行3条
[root@ansible ~]# ansible web -m shell -a 'echo "aaaaa" > /var/www/html/index.html'  #编写网页
192.168.100.203 | SUCCESS | rc=0 >>

[root@ansible ~]# curl 192.168.100.203:8080   #测试访问
aaaaa

在这里插入图片描述

正常安装httpd也会执行,这是因为我的目标主机已经安装了httpd,所以没有执行

[root@ansible ~]# sed -i "s/8080/80/g" httpd.conf   #修改配置文件再次执行剧本
[root@ansible ~]# ansible-playbook  playnook01.yaml   #再次执行剧本

PLAY [web] ******************************************************************************************************************************

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

TASK [安装httpd] **************************************************************************************************************************
ok: [192.168.100.203]

TASK [修改配置文件] ***************************************************************************************************************************
changed: [192.168.100.203]

TASK [启动httpd] **************************************************************************************************************************
ok: [192.168.100.203]

RUNNING HANDLER [restart httpd] *********************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=5    changed=2    unreachable=0    failed=0     #发现这一次只执行成功两条命令

在这里插入图片描述

在这里插入图片描述

在执行剧本时,只有一些操作发生改变,剧本中的命令才会执行,例如第一次执行成功三条命令,其中一条是启动httpd,但是在第二次和第三次执行剧本时,启动httpd的命令是没有执行的,这是因为第一次已经执行成功,而第二、三次在目标主机上执行是没有变化的所以不会执行,故第一次和第二次都修改了配置文件,所以触发了restart httpd的动作,所以执行成功,而第三次什么修改都不做,那么目标主机也不会有任何变化,所以没有一条命令执行成功

-Playbook中变量的使用

-首先先定义主机组
[root@ansible ~]# tail -7 /etc/ansible/hosts 
[web01]
192.168.100.203
[web02]
192.168.100.204
[web:children]
web01
web02
-命令行执行变量
#执行剧本时可以通过-e参数传入变量,这样传入的变量在目标剧本中都可以被调用,属于全局变量,并且这样定义的变量优先级是最高的
[root@ansible ~]# vim playbook02.yaml
---
- hosts: web01
  remote_user: root
  tasks:
  - name: 创建新文件
    file: name={{ hehe }} state=touch #这里定义变量hehe
#保存退出
[root@ansible ~]# ansible-playbook -e "hehe=aaaaaa" playbook02.yaml   #使用-e导入变量hehe,并且执行剧本,要注意这样导入变量的剧本,在使用-C监测是会报错的

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建新文件] ****************************************************************************************************************************
changed: [192.168.100.203]

TASK [写入数据] *****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=3    changed=2    unreachable=0    failed=0   
[root@ansible ~]# ansible web01 -m shell -a 'ls'  #验证效果
192.168.100.203 | SUCCESS | rc=0 >>
aaaaaa
anaconda-ks.cfg
-hosts文件中自定义变量
#在ansible的hosts文件中可以自定义变量,定义的是主机或者一个组的变量,要注意的是,一个组定义的变量的优先级没有单个主机定义变量的优先级高
[root@ansible ~]# vim /etc/ansible/hosts     #分别给主机和组定义变量测测试效果
[web01]
192.168.100.203 hehe=bbbbbb    
[web02]
192.168.100.204
[web01:vars]
hehe=aaaaaa
[root@ansible ~]# ansible web01 -m shell -a 'rm -rf aaaaaa'  #删除aaaaaa
 [WARNING]: Consider using the file module with state=absent rather than running rm.  If you need to use command because file is
insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

192.168.100.203 | SUCCESS | rc=0 >>
[root@ansible ~]# ansible-playbook -C playbook02.yaml  #监测剧本

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建新文件] ****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  playbook02.yaml   #执行剧本

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建新文件] ****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible web01 -m shell -a 'ls'  #验证效果,发现是主机定义的变量生效了
192.168.100.203 | SUCCESS | rc=0 >>
anaconda-ks.cfg
bbbbbb
-剧本文件中定义变量
#在编写剧本时,可以直接在剧本中定义变量,然后直接引用,可以一次性定义多个变量,注意剧本里定义的变量的优先级是没有通过-e参数定义变量的优先级高的
[root@ansible ~]# vim playbook02.yaml   #修改剧本文件
---
- hosts: web01
  remote _user: root
  vars:         #定义变量
    hehe: abcde
  tasks:
  - name: 创建新文件
    file: name={{ hehe }} state=touch
[root@ansible ~]# ansible web01 -m shell -a 'rm -rf bbbbbb'  #删除之前创建的文件
[WARNING]: Consider using the file module with state=absent rather than running rm.  If you need to use command because file is
insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

192.168.100.203 | SUCCESS | rc=0 >>
[root@ansible ~]# ansible-playbook -C playbook02.yaml   #监测剧本是否有问题

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建新文件] ****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook playbook02.yaml   #执行剧本

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建新文件] ****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible web01 -m shell -a 'ls'  #验证效果
192.168.100.203 | SUCCESS | rc=0 >>
abcde
anaconda-ks.cfg
[root@ansible ~]# ansible web01 -m shell -a 'rm -rf abcde'  #删除abcde
 [WARNING]: Consider using the file module with state=absent rather than running rm.  If you need to use command because file is
insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

192.168.100.203 | SUCCESS | rc=0 >>


[root@ansible ~]# ansible-playbook -e "hehe=aaaaaa" playbook02.yaml   #使用-e参数执行剧本

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建新文件] ****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible web01 -m shell -a 'ls'   #验证效果,发现是-e参数定义的变量生效
192.168.100.203 | SUCCESS | rc=0 >>
aaaaaa
anaconda-ks.cfg
-调用setup模块获取变量
#setup模块默认是获取主机信息的,有时候在剧本中需要使用,所以可以直接调用,其实就是内置变量
[root@ansible ~]# vim playbook03.yaml
---
- hosts: web01
  remote_user: root
  tasks:
  - name: 创建文件
    file: name={{ ansible_fqdn }}.log state=touch   #引用内置变量ansible_fqdn,这个内置变量的作用是获取主机名
#保存退出
[root@ansible ~]# ansible-playbook -C playbook03.yaml   

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  playbook03.yaml   #执行剧本

PLAY [web01] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.203]

PLAY RECAP ******************************************************************************************************************************
192.168.100.203            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible web01 -m shell -a 'ls'
192.168.100.203 | SUCCESS | rc=0 >>
aaaaaa
anaconda-ks.cfg
node1.log   #这就是剧本创建的文件
-独立的变量——yaml文件中定义
#为了方便管理可以将所有的变量统一放在一个独立的变量yaml文件中,剧本文件直接引用变量yaml文件即可
[root@ansible ~]# vim var.yml    #创建存放变量的yml文件
aaa: hehe
bbb: haha
#保存退出
[root@ansible ~]# vim text.yaml  #创建剧本
---
- hosts: web02
  remote_user: root
  vars_files:
    - /root/var.yml
  tasks:
  - name: 创建文件
    file: path=/root/{{ aaa }}.txt state=touch   #分别引用变量
  - name: 创建文件
    file: path=/root/{{ bbb }}.txt state=touch
#保存退出
[root@ansible ~]# ansible-playbook -C text.yaml   #监测剧本是否有问题

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook text.yaml   #执行剧本

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   
[root@ansible ~]# ansible web02 -m shell -a 'ls'  #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
anaconda-ks.cfg
haha.txt
hehe.txt 

-Playbook中标签的使用

#如果想只执行剧本中的单独一个任务,那么只需要给每个任务集添加标签,这样在想执行单个任务时,直接通过-t参数引用标签来执行对应的命令,还可以通过--skip-tags选择除了某个标签其他的标签全部执行
[root@ansible ~]# vim tags.yaml
---
- hosts: web02
  remote_user: root
  tasks:
  - name: 创建aaa文件
    file: path=/root/aaa state=touch
    tags: touch
  - name: 创建bbb目录
    file: path=/root/bbb state=directory
    tage: directory
  - name: 创建用户ccc
    user: name=ccc 
    tage: user
#保存退出
[root@ansible ~]# ansible web02 -m shell -a 'rm -rf *'  #先删除web02的root下的所有文件
 [WARNING]: Consider using the file module with state=absent rather than running rm.  If you need to use command because file is
insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

192.168.100.204 | SUCCESS | rc=0 >>


[root@ansible ~]# ansible web02 -m shell -a 'ls'  #确认删除
192.168.100.204 | SUCCESS | rc=0 >>
 [root@ansible ~]# ansible-playbook -C tags.yaml  #监测剧本是否有问题
 [WARNING]: Ignoring invalid attribute: tage


PLAY [web02] ****************************************************************************************************************************

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

TASK [创建aaa文件] **************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建bbb目录] **************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建用户ccc] **************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=4    changed=3    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  tags.yaml   #先正常执行剧本,查看效果
 [WARNING]: Ignoring invalid attribute: tage


PLAY [web02] ****************************************************************************************************************************

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

TASK [创建aaa文件] **************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建bbb目录] **************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建用户ccc] **************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=4    changed=3    unreachable=0    failed=0   
[root@ansible ~]# ansible web02 -m shell -a 'ls'   #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
aaa
bbb

[root@ansible ~]# ansible web02 -m shell -a 'tail -1 /etc/passwd'   #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
ccc:x:1000:1000::/home/ccc:/bin/bash
[root@ansible ~]# ansible web02 -m shell -a 'rm -rf *'  #删除创建的文件
 [WARNING]: Consider using the file module with state=absent rather than running rm.  If you need to use command because file is
insufficient you can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

192.168.100.204 | SUCCESS | rc=0 >>

[root@ansible ~]# ansible web02 -m user -a 'name=ccc state=absent'  #删除用户
192.168.100.204 | SUCCESS => {
    "changed": true, 
    "force": false, 
    "name": "ccc", 
    "remove": false, 
    "state": "absent"
} 
[root@ansible ~]# ansible-playbook -t touch tags.yaml   #只执行标签为touch的命令
 [WARNING]: Ignoring invalid attribute: tage


PLAY [web02] ****************************************************************************************************************************

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

TASK [创建aaa文件] **************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0     #可以看到只执行了一条命令

[root@ansible ~]# ansible web02 -m shell -a 'ls'  #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
aaa
[root@ansible ~]# ansible-playbook --skip-tags  touch tags.yaml  #除了标签为touch的命令其他的命令都执行
 [WARNING]: Ignoring invalid attribute: tage


PLAY [web02] ****************************************************************************************************************************

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

TASK [创建bbb目录] **************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建用户ccc] **************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0     #可以看到三条命令执行了两条命令
[root@ansible ~]# ansible web02 -m shell -a 'ls'  #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
bbb

[root@ansible ~]# ansible web02 -m shell -a 'tail -1 /etc/passwd'  #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
ccc:x:1000:1000::/home/ccc:/bin/bash

-Playbook中模板的使用(.j2)

  • template模板提供了动态配置服务,使用jinja2语言,支持多种条件判断、循环、逻辑运算、比较操作等,其实也是一个文件,和之前配置文件使用copy一样,只是使用copy,不能根据服务器配置不一样而进行不同的动态配置,这样不利于管理
  • 大多数情况下都将template文件放在和剧本文件同级的templates目录下,需要手动创建,这样剧本文件可以直接引用,会自动去找这个文件,.j2模板文件可以应用playbook剧本中的变量,只需要在模板文件中使用{{ }}去定义变量名称,然后在剧本中就可以指定变量值
  • 模板文件后缀名为.j2
#循环参考
[root@ansible ~]# vim text.yaml
---
- hosts: web02
  remote_user: root
  vars:
    - listen_port: 8080
  tasks:
  - name: 安装httpd
    yum: name=httpd state=installed
  - name: 修改httpd配置文件
    template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf  #使用模板
    notify:    #使用触发
      - restart httpd
  - name: 启动httpd
    service: name=httpd state=started
  handlers:  #配置触发相应的动作
    - name: restart httpd
      service: name=httpd state=restarted
 #保存退出
 [root@ansible ~]# ll
总用量 16
-rw-r--r-- 1 root root 11753 623 22:49 httpd.conf   #准备一个配置文件
-rw-r--r-- 1 root root   417 623 22:47 text.yaml
[root@ansible ~]# vim httpd.conf
。。。。。。。
 41 #Listen 12.34.56.78:80
 42 Listen {{ listen_port }}   #引用变量
 43 
。。。。。。
#保存退出
[root@ansible ~]# mv httpd.conf httpd.conf.j2  #修改名称变成jinja2模板文件
[root@ansible ~]# mkdir templates
[root@ansible ~]# mv httpd.conf.j2 templates/
[root@ansible ~]# yum -y install tree
。。。。。。
完毕!
[root@ansible ~]# tree
.
├── templates              #templates需要和剧本文件是同级关系,然后再templates中存放要copy的.j2模板文件
│   └── httpd.conf.j2
└── text.yaml
[root@ansible ~]# ansible-playbook -C text.yaml   #监测剧本是否有问题

PLAY [web02] ****************************************************************************************************************************

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

TASK [安装httpd] **************************************************************************************************************************
changed: [192.168.100.204]

TASK [修改httpd配置文件] **********************************************************************************************************************
changed: [192.168.100.204]

TASK [启动httpd] **************************************************************************************************************************
changed: [192.168.100.204]

RUNNING HANDLER [restart httpd] *********************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=5    changed=4    unreachable=0    failed=0   
[root@ansible ~]# ansible web02 -m shell -a 'echo "aaaa" > /var/www/html/index.html'  #编写网页
192.168.100.204 | SUCCESS | rc=0 >>


[root@ansible ~]# curl 192.168.100.204:8080  #测试验证效果
aaaa

-template之when

  • when是条件测试,如果需要根据变量、facts或者此前任务的执行结果来决定某个tasks是否执行的话,可以使用when进行条件判断
  • when语句一般在tasks后添加即可进行条件测试
  • when语句支持jinja2表达式语法
[root@ansible ~]# vim when.yaml 
---
- hosts: web02
  remote_user: root
  tasks:
  - name: 创建文件
    file: path=/root/aaa state=touch
    when: ansible_distribution_major_version == "7"     #当系统版本等于7时才会执行对应的命令并且触发动作
    notify:
    - echo01
  - name: 创建文件
    file: path=/root/bbb state=touch
    when: ansible_distribution_major_version == "6"     #当系统版本等于6时才会执行对应的命令并且触发动作
    notify:
    - echo02
  handlers:   #动作
    - name: echo01
      shell: echo "777777777777" > /root/aaa
    - name: echo02
      shell: echo "666666666666" > /root/bbb
#保存退出
[root@ansible ~]# ansible-playbook -C when.yaml   #监测剧本是否有问题

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建文件] *****************************************************************************************************************************
skipping: [192.168.100.204]

RUNNING HANDLER [echo01] ****************************************************************************************************************
skipping: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook   when.yaml   #执行剧本

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

TASK [创建文件] *****************************************************************************************************************************
skipping: [192.168.100.204]

RUNNING HANDLER [echo01] ****************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   

[root@ansible ~]# ansible web02 -m shell -a 'cat aaa'  #验证效果,因为系统版本是7,所以触发了echo01动作
192.168.100.204 | SUCCESS | rc=0 >>
777777777777

-template之with_items

  • with_items迭代,当有需要重复性执行的任务时,可以使用迭代机制,一个任务下的items的迭代变量只会在当前任务下生效
  • 对迭代项的引用,固定变量名为“item”,要在task中使用
  • with_items定义要迭代的元素列表,这个列表可以是字符串和字典
******迭代写入文件内容
[root@ansible ~]# vim items.yaml
---
- hosts: web02
  remote_user: root
  tasks:
  - name: 创建文件
    file: path=/root/abc state=touch
  - name: 写入内容
    shell: echo "{{ item }}" >> /root/abc
    with_items:            #迭代执行,类似于for循环,item的值会从123一直到ABC
      - 123
      - abc
      - ABC
#保存退出      
————————————————————————————————————————
#上面的写法相当于
 - name: 写入内容
    shell: echo "123" >> /root/abc
  - name: 写入内容
    shell: echo "abc" >> /root/abc
   - name: 写入内容
    shell: echo "ABC" >> /root/abc  
————————————————————————————————————————

[root@ansible ~]# ansible-playbook -C items.yaml   #监测剧本是否有问题

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

TASK [写入内容] *****************************************************************************************************************************
skipping: [192.168.100.204] => (item=123) 
skipping: [192.168.100.204] => (item=abc) 
skipping: [192.168.100.204] => (item=ABC) 

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  items.yaml  #执行剧本

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建文件] *****************************************************************************************************************************
changed: [192.168.100.204]

TASK [写入内容] *****************************************************************************************************************************
changed: [192.168.100.204] => (item=123)
changed: [192.168.100.204] => (item=abc)
changed: [192.168.100.204] => (item=ABC)

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   
[root@ansible ~]# ansible web02 -m shell -a 'cat /root/abc'  #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
123
abc
ABC

******迭代创建用户,并且迭代指定用户名和组
[root@ansible ~]# vim users.yaml
---
- hosts: web02
  remote_user: root
  tasks:
  - name: 创建新组
    group: name={{ item }} state=present
    with_items:     #items可以是字符串
      - B1
      - B2
      - B3
  - name: 创建用户
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:     #items可以是字典类型的,值只需要用.指定即可
      - { name: 'A1', group: 'B1' }   #注意空格隔开
      - { name: 'A2', group: 'B2' }
      - { name: 'A3', group: 'B3' }
#保存退出
[root@ansible ~]# ansible-playbook -C users.yaml   #监测剧本是否有问题

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建新组] *****************************************************************************************************************************
changed: [192.168.100.204] => (item=B1)
changed: [192.168.100.204] => (item=B2)
changed: [192.168.100.204] => (item=B3)

TASK [创建用户] *****************************************************************************************************************************
changed: [192.168.100.204] => (item={u'group': u'B1', u'name': u'A1'})
changed: [192.168.100.204] => (item={u'group': u'B2', u'name': u'A2'})
changed: [192.168.100.204] => (item={u'group': u'B3', u'name': u'A3'})

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   

[root@ansible ~]# ansible-playbook users.yaml  #执行剧本

PLAY [web02] ****************************************************************************************************************************

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

TASK [创建新组] *****************************************************************************************************************************
changed: [192.168.100.204] => (item=B1)
changed: [192.168.100.204] => (item=B2)
changed: [192.168.100.204] => (item=B3)

TASK [创建用户] *****************************************************************************************************************************
changed: [192.168.100.204] => (item={u'group': u'B1', u'name': u'A1'})
changed: [192.168.100.204] => (item={u'group': u'B2', u'name': u'A2'})
changed: [192.168.100.204] => (item={u'group': u'B3', u'name': u'A3'})

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=3    changed=2    unreachable=0    failed=0   

[root@ansible ~]# ansible web02 -m shell -a "tail -3 /etc/passwd"  #验证效果,是否成功创建用户
192.168.100.204 | SUCCESS | rc=0 >>
A1:x:1004:1007::/home/A1:/bin/bash
A2:x:1005:1008::/home/A2:/bin/bash
A3:x:1006:1009::/home/A3:/bin/bash

[root@ansible ~]# vim users.yaml
[root@ansible ~]# ansible web02 -m shell -a "tail -3 /etc/group"   #是否成功创建组
192.168.100.204 | SUCCESS | rc=0 >>
B1:x:1007:
B2:x:1008:
B3:x:1009:
[root@ansible ~]# ansible web02 -m shell -a "groups A1"  #是否成功把用户分配到相应的组中
192.168.100.204 | SUCCESS | rc=0 >>
A1 : B1

[root@ansible ~]# ansible web02 -m shell -a "groups A2"
192.168.100.204 | SUCCESS | rc=0 >>
A2 : B2

[root@ansible ~]# ansible web02 -m shell -a "groups A3"
192.168.100.204 | SUCCESS | rc=0 >>
A3 : B3

-template之for、 if

通过使用for、if可以更加灵活的生成配置文件等需求,还可以在里面根据各种条件进行判断,然后生成不同的配置文件、或者服务器配置相关等

通常是使用在批量配置nginx等web服务的虚拟主机时使用

******简单的使用for循环配合模板编写文件内容
[root@ansible ~]# vim text.yaml
---
- hosts: web02
  remote_user: root
  vars:
    port:     #定义变量
      - 80
      - 81
      - 82
  tasks:
  - name: 复制模板文件
    template: src=/root/abc.j2 dest=/root/abc.txt  
#保存退出
[root@ansible ~]# vim abc.j2  #编写模板文件
{% for i in port %}   #使用for循环进行取值
------------------------
nginx端口号是:{{ i }}
------------------------
{% endfor %}
#保存退出
[root@ansible ~]# ansible-playbook -C text.yaml   #监测剧本是否有问题
 [WARNING]: Found variable using reserved name: port

PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook text.yaml   #执行剧本
 [WARNING]: Found variable using reserved name: port


PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible web02 -m shell -a 'cat abc.txt'  #验证效果,可以应用到nginx创建虚拟主机中
192.168.100.204 | SUCCESS | rc=0 >>
------------------------
nginx端口号是:80
------------------------
------------------------
nginx端口号是:81
------------------------
------------------------
nginx端口号是:82
------------------------
******继续上面的剧本,使用多层嵌套的for循环
[root@ansible ~]# vim text.yaml 
---
- hosts: web02
  remote_user: root
  vars:
    text:      #使用多层嵌套来定义变量
      - A:
        port: 80
        name: aaa
        age: 18
      - B:
        port: 81
        name: bbb
        age: 19
      - C:
        port: 82
        name: ccc
        age: 20
  tasks:
  - name: 复制模板文件
    template: src=/root/vvv.j2 dest=/root/vvv.txt
#保存退出
[root@ansible ~]# vim vvv.j2
{% for i in text %}
--------------------------
端口号是:{{ i.port }}
主机名是:{{ i.name }}
存活时间是: {{ i.age }}
--------------------------
{% endfor %}
#保存退出
[root@ansible ~]# ansible-playbook -C text.yaml  #监测剧本是否有问题,当模板有问题时也会报错

PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook  text.yaml   #执行剧本

PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible web02 -m shell -a 'cat vvv.txt'   #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
--------------------------
端口号是:80
主机名是:aaa
存活时间是: 18
--------------------------
--------------------------
端口号是:81
主机名是:bbb
存活时间是: 19
--------------------------
--------------------------
端口号是:82
主机名是:ccc
存活时间是: 20
--------------------------
******在for循环中再嵌套if语句,可以使生成的数据更加灵活
[root@ansible ~]# vim text.yaml
---
- hosts: web02
  remote_user: root
  vars:
    text:
    - A:
      port: 80
      name: aaa
      age: 18
    - B:        #留一个不设置port变量的
      name: bbb
      age: 19
    - C:
      port: 82
      name: ccc
      age: 20
  tasks:
  - name: 复制模板文件
    template: src=/root/rrr.j2 dest=/root/rrr.txt
#保存退出   
[root@ansible ~]# vim rrr.j2
{% for i in text %}
信息:
{% if i.port is defined %}  #这里的is defined表示当i.port变量语句定义的时候就输出端口号: {{ i.port }}
端口号: {{ i.port }}
{% else %}   #否则输出端口号: 8888
端口号: 8888
{% endif %}  #第一个if语句结束
主机名: {{ i.name }}
存活时间: {{ i.age }}
{% endfor %}
#保存退出
[root@ansible ~]# ansible-playbook -C text.yaml 

PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   
[root@ansible ~]# ansible-playbook -C text.yaml 

PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible-playbook  text.yaml  #执行剧本

PLAY [web02] ****************************************************************************************************************************

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

TASK [复制模板文件] ***************************************************************************************************************************
changed: [192.168.100.204]

PLAY RECAP ******************************************************************************************************************************
192.168.100.204            : ok=2    changed=1    unreachable=0    failed=0   

[root@ansible ~]# ansible web02 -m shell -a 'cat rrr.txt' #验证效果
192.168.100.204 | SUCCESS | rc=0 >>
信息:
端口号: 80
主机名: aaa
存活时间: 18 
信息:
端口号: 8888  #因为在剧本中第二个是没有定义变量值的,所以通过if语句,这里输出的是8888
主机名: bbb
存活时间: 19 
信息:
端口号: 82
主机名: ccc
存活时间: 20 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值