Ansible Playbook 详解

一、playbook 的简单使用

1、创建文件实例

(1)编辑配置文件

[root@tiejiangSRC1 ~]# cd /etc/ansible/
[root@tiejiangSRC1 ansible]# vim test.yml        //固定后缀为yml,一定要注意空格
    ---
    - hosts: testhost
      user: root
      tasks:
        - name: playbook_test
          shell: touch /tmp/playbook.txt

注意:

  • hosts参数指定了对哪些主机进行参作;
  • user参数指定了使用什么用户登录远程主机操作;
  • tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。

(2)执行创建playbook文件文件

[root@tiejiangSRC1 ansible]# ansible-playbook test.yml 
    PLAY [testhost] ****************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.2.71]
    ok: [192.168.2.73]
    ok: [192.168.2.72]

    TASK [playbook_test] ***********************************************************
    changed: [192.168.2.71]
    changed: [192.168.2.73]
    changed: [192.168.2.72]

    PLAY RECAP *********************************************************************
    192.168.2.71               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.72               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.73               : ok=2    changed=1    unreachable=0    failed=0

(3)现在来查看是否批量创建成功playbook.txt文件。

[root@tiejiangSRC1 ~]# ansible testhost -m command -a 'ls -l /tmp/playbook.txt'
    192.168.2.73 | SUCCESS | rc=0 >>
    -rw-r--r-- 1 root root 33 4月  19 13:41 /tmp/playbook.txt

    192.168.2.71 | SUCCESS | rc=0 >>
    -rw-r--r--. 1 root root 33 4月  19 13:41 /tmp/playbook.txt

    192.168.2.72 | SUCCESS | rc=0 >>
    -rw-r--r--. 1 root root 33 4月  19 13:41 /tmp/playbook.txt

(4)给创建的playbook批量导入内容,并查看导入的结果

[root@tiejiangSRC1 ansible]# vim test.yml 
    ---
    - hosts: testhost
      user: root
      tasks:
        - name: 铁匠运维网博客
          shell: echo "www.tiejiang.org" >> /tmp/playbook.txt
[root@tiejiangSRC1 ansible]# ansible-playbook test.yml 
    PLAY [testhost] ****************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.2.71]
    ok: [192.168.2.72]
    ok: [192.168.2.73]

    TASK [铁匠运维网博客] *************************************************************
    changed: [192.168.2.73]
    changed: [192.168.2.71]
    changed: [192.168.2.72]

    PLAY RECAP *********************************************************************
    192.168.2.71               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.72               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.73               : ok=2    changed=1    unreachable=0    failed=0   

[root@tiejiangSRC1 ansible]# ansible testhost -m command -a 'cat /tmp/playbook.txt'
    192.168.2.73 | SUCCESS | rc=0 >>
    www.tiejiang.org

    192.168.2.71 | SUCCESS | rc=0 >>
    www.tiejiang.org

    192.168.2.72 | SUCCESS | rc=0 >>
    www.tiejiang.org

2、创建用户实例

(1)编辑配置文件

[root@tiejiangSRC1 yml]# vim create_user.yml
    ---
    - name: create_user
      hosts: testhost
      user: root
      gather_facts: false
      vars:
        - user: "tiejiang"
      tasks:
        - name: create user
          user: name="{{ user }}"
  • name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
  • gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
  • vars参数指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
  • user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。

(2)执行配置文件

[root@tiejiangSRC1 ansible]# ansible-playbook create_user.yml 

PLAY [create_user] *************************************************************

TASK [create user] *************************************************************
changed: [192.168.2.73]
changed: [192.168.2.71]
changed: [192.168.2.72]

PLAY RECAP *********************************************************************
192.168.2.71               : ok=1    changed=1    unreachable=0    failed=0   
192.168.2.72               : ok=1    changed=1    unreachable=0    failed=0   
192.168.2.73               : ok=1    changed=1    unreachable=0    failed=0

(3)查看远程机器的passwd文件,是否创建出来了用户

[root@tiejiangSRC1 ansible]# ansible testhost -m command -a 'grep tiejiang /etc/passwd'
    192.168.2.73 | SUCCESS | rc=0 >>
    tiejiang:x:502:502::/home/tiejiang:/bin/bash

    192.168.2.72 | SUCCESS | rc=0 >>
    tiejiang:x:501:501::/home/tiejiang:/bin/bash

    192.168.2.71 | SUCCESS | rc=0 >>
    tiejiang:x:502:502::/home/tiejiang:/bin/bash

二、playbook循环

实例:修改/tmp目录下的1.txthe 2.txt文件属性

(1)去新建实验文件

[root@tiejiangSRC1 yml]# cat touch1and2.yml 
---
- hosts: testhost
  user: root
  tasks:
    - name: 创建实验文件
      shell: touch /tmp/{1.txt,2.txt}

[root@tiejiangSRC1 yml]# ansible-playbook touch1and2.yml 

    PLAY [testhost] ****************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.2.73]
    ok: [192.168.2.71]
    ok: [192.168.2.72]

    TASK [创建实验文件] ******************************************************************
    changed: [192.168.2.73]
     [WARNING]: Consider using file module with state=touch rather than running touch

    changed: [192.168.2.71]
    changed: [192.168.2.72]

    PLAY RECAP *********************************************************************
    192.168.2.71               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.72               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.73               : ok=2    changed=1    unreachable=0    failed=0

(2)编辑配置文件

[root@tiejiangSRC1 yml]# cat loop.yml 
    ---
    - hosts: testhost
      user: root
      tasks:
        - name: change mode for files
          file: path=/tmp/{{ item }} mode=600 owner=root group=root
          with_items:
            - 1.txt
            - 2.txt

(3)执行配置文件

[root@tiejiangSRC1 yml]# ansible-playbook loop.yml 
    PLAY [testhost] ****************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.2.71]
    ok: [192.168.2.72]
    ok: [192.168.2.73]

    TASK [change mode for files] ***************************************************
    changed: [192.168.2.73] => (item=1.txt)
    changed: [192.168.2.71] => (item=1.txt)
    changed: [192.168.2.72] => (item=1.txt)
    changed: [192.168.2.73] => (item=2.txt)
    changed: [192.168.2.71] => (item=2.txt)
    changed: [192.168.2.72] => (item=2.txt)

    PLAY RECAP *********************************************************************
    192.168.2.71               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.72               : ok=2    changed=1    unreachable=0    failed=0   
    192.168.2.73               : ok=2    changed=1    unreachable=0    failed=0

三、playbook条件判断

条件判断一般用于针对不同版本的系统,比如对centos、ubuntu 等系统进行不同的操作命令。

(1)编辑配置文件

[root@tiejiangSRC1 yml]# vim when.yml
    ---
    - hosts: testhost
      user: root
      gather_facts: True
      tasks:
        - name: use when
          shell: touch /tmp/when.txt
          when: ansible_default_ipv4.address == "192.168.2.73"

(2)执行配置文件

[root@tiejiangSRC1 yml]# ansible-playbook when.yml
    PLAY [testhost] ****************************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.2.71]
    ok: [192.168.2.73]
    ok: [192.168.2.72]

    TASK [use when] ****************************************************************
    skipping: [192.168.2.71]
    skipping: [192.168.2.72]
    changed: [192.168.2.73]
     [WARNING]: Consider using file module with state=touch rather than running touch


    PLAY RECAP *********************************************************************
    192.168.2.71               : ok=1    changed=0    unreachable=0    failed=0   
    192.168.2.72               : ok=1    changed=0    unreachable=0    failed=0   
    192.168.2.73               : ok=2    changed=1    unreachable=0    failed=0

四、playbook handlers

当我们执行 tasks 后,服务器发生变化之后我们要执行一些操作。比如我们修改了某个服务的配置文件,需要重启下服务。实例如下:

(1)编辑配置文件

[root@tiejiangSRC1 yml]# vim handlers.yml
    ---
    - name: handlers test
      hosts: testhost
      user: root
      tasks:
        - name: test copy
          copy: src=/etc/passwd dest=/tmp/handlers.txt
          notify: test handlers
      handlers:
        - name: test handlers
          shell: echo "www.tiejiang.org" >> /tmp/handlers.txt

说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。也就是说如果 src 和 dest 内容是一样的,并不会去执行 handlers 里面的 shell 相关命令。所以这种比较适合配置文件发生更改后,需要重启服务的操作。

(2)执行配置文件

[root@tiejiangSRC1 yml]# ansible-playbook handlers.yml
    PLAY [handlers test] ***********************************************************

    TASK [setup] *******************************************************************
    ok: [192.168.2.73]
    ok: [192.168.2.71]
    ok: [192.168.2.72]

    TASK [test copy] ***************************************************************
    changed: [192.168.2.71]
    changed: [192.168.2.73]
    changed: [192.168.2.72]

    RUNNING HANDLER [test handlers] ************************************************
    changed: [192.168.2.71]
    changed: [192.168.2.73]
    changed: [192.168.2.72]

    PLAY RECAP *********************************************************************
    192.168.2.71               : ok=3    changed=2    unreachable=0    failed=0   
    192.168.2.72               : ok=3    changed=2    unreachable=0    failed=0   
    192.168.2.73               : ok=3    changed=2    unreachable=0    failed=0

(3)查看执行结果

[root@tiejiangSRC1 yml]# ansible testhost -m command -a 'tail -n 1 /tmp/handlers.txt '     //这里我直接用-n 1显示handlers.txt的最后一行内容
192.168.2.71 | SUCCESS | rc=0 >>
www.tiejiang.org

192.168.2.73 | SUCCESS | rc=0 >>
www.tiejiang.org

192.168.2.72 | SUCCESS | rc=0 >>
www.tiejiang.org

可查看到 copy 文件成功,同时也执行了 handlers 的相关命令,追加了新的信息。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

无招胜有招: 看我如何通过劫持COM服务器绕过AMSI

? 在Windows 10中,Microsoft的反恶意软件扫描接口(AMSI)被作为新功能被引入,作为标准接口,该功能可以让反病毒引擎将特征规则应用于机器的...

2887
来自专栏北京马哥教育

linux服务器下LNMP安装与配置方法

云豆贴心提醒,本文阅读时间6分钟 一、准备 1.准备php函数的rpm包 2.准备lnmp其他的源代码包 3.安装php-5.2.14源代码包所需要的函数支...

3109
来自专栏有趣的Python

9- vue django restful framework 打造生鲜超市 -用户登录和手机注册(上)

Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 手机注册和用户登录(上) drf的...

44412
来自专栏架构师之旅

expdp|impdp及exp|imp指令介绍

expdp介绍 EXPDP命令行选项 1. ATTACH 该选项用于在客户会话与已存在导出作用之间建立关联.语法如下 ATTACH=[schema_name.]...

1849
来自专栏腾讯云Elasticsearch Service

logstash input插件开发

logstash作为一个数据管道中间件,支持对各种类型数据的采集与转换,并将数据发送到各种类型的存储库,比如实现消费kafka数据并且写入到Elasticsea...

2454
来自专栏数据和云

【备份策略】使用逻辑备份辅助物理备份

通常进行了物理备份还不足够,因为在很多情况下使用物理备份进行恢复会相对复杂,比如误操作TRUNCATE了数据表,这样的恢复有时候使用逻辑备份来恢复会更迅速、更...

35011
来自专栏hbbliyong

WCF 学习总结1 -- 简单实例

从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术。WCF统一的模型整合了以往的 WebS...

3617
来自专栏张善友的专栏

自定义WCF的配置文件

WCF的承载既可以通过编码实现,也能够通过配置实现.而且使用配置,更有利于日后的维护和扩展。我们经常会碰到这样的一个场景:需要把WCF的配置信息放在一个单独的文...

1858
来自专栏尚国

利用PowerUpSQL攻击SQL Server实例

这篇博客简述如何快速识别被第三方应用使用的SQL Server实例,该第三方软件用PowerUpSQL配置默认用户/密码配置。虽然我曾经多次提到过这一话题,但是...

573
来自专栏大内老A

.NET Core的文件系统[1]:读取并监控文件的变化

ASP.NET Core 具有很多针对文件读取的应用。比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取。如果用户发送一个针对物理文件的...

3895

扫码关注云+社区