Ansible Playbooks 介绍 和 使用 二

目录

  • handlers

    • playbook 案例 2 handlers
    • vars 变量
      • setup facts 变量使用
      • 案例
      • inventory 中定义变量
      • 案例
  • 条件测试
    • when 语句
    • 案例

handlers

接上一篇文章 Ansible Playbooks 介绍 和 使用 一 继续说明

用于当关注的资源发生变化时采取一定的操作。

notify这个 action可用于在每个play的最后被处罚,这样可以避免多次有改变时每次都执行指定的操作,取而代之,尽在所有的变化发生完成后一次性执行指定的操作。在notify中列出的操作成为handler。

例如:

- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
  - restart memcached
  - restart apache

handler是task列表,这些task与前述task并没有本质上的不同。

handlers:
- name: restart memcached
  service: name=memcached state=restarted
- name: restart apache
  service: name=httpd state=restarted

playbook 案例 2 handlers

应用场景

在webservs组安装httpd服务,默认启动httpd监听的是80端口

步骤

  1. 创建一个配置安装httpd服务的playbook,并配置开机器启动等相关操作
  2. 执行httpd.yml
  3. 修改配置文件httpd.conf中的端口为8080
  4. 再次执行httpd的playbook文件

首先创建httpd.yml文件

[[email protected] ansible]# pwd
/etc/ansible
[[email protected] ansible]# cat httpd.yml
- hosts: webservs
  remote_user: root
  tasks:
  - name: install httpd packge
    yum: name=httpd state=present
  - name: configuration file for httpd
    copy: src=/etc/ansible/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd service
    service: name=httpd enabled=true state=started

创建配置文件目录,并拷贝httpd.conf

[[email protected] ansible]# pwd
/etc/ansible
[[email protected] ansible]# mkdir conf
[[email protected] ansible]# cp /etc/httpd/conf/httpd.conf conf/
[[email protected] ansible]# vim conf/httpd.conf

执行httpd.yuml的playbook

[[email protected] ansible]# ansible-playbook httpd.yml 

PLAY [webservs] ***********************************************************************************************************

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

TASK [install httpd packge] ***********************************************************************************************
changed: [10.0.0.65]

TASK [configuration file for httpd] ***************************************************************************************
ok: [10.0.0.65]

TASK [start httpd service] ************************************************************************************************
changed: [10.0.0.65]

PLAY RECAP ****************************************************************************************************************
10.0.0.65                  : ok=4    changed=2    unreachable=0    failed=0

验证:

[[email protected] ansible]# ansible webservs -a ‘rpm -qa httpd‘
10.0.0.65 | CHANGED | rc=0 >>
httpd-2.4.6-80.el7.centos.1.x86_64

[[email protected] ansible]# ansible webservs -m shell -a ‘netstat -lntup | grep 80‘
10.0.0.65 | CHANGED | rc=0 >>
tcp6       0      0 :::80                   :::*                    LISTEN      31354/httpd

修改ansible服务端下httpd.conf配置文件中的端口为8080,然后重新执行

[[email protected] ansible]# egrep ‘^Listen‘ conf/httpd.conf
Listen 8080
[[email protected] ansible]# ansible-playbook httpd.yml 

PLAY [webservs] ***********************************************************************************************************

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

TASK [install httpd packge] ***********************************************************************************************
ok: [10.0.0.65]

TASK [configuration file for httpd] ***************************************************************************************
changed: [10.0.0.65]

TASK [start httpd service] ************************************************************************************************
ok: [10.0.0.65]

PLAY RECAP ****************************************************************************************************************
10.0.0.65                  : ok=4    changed=1    unreachable=0    failed=0   

[[email protected] ansible]# ansible webservs -m shell -a ‘netstat -lntup | grep httpd‘
10.0.0.65 | CHANGED | rc=0 >>
tcp6       0      0 :::80                   :::*                    LISTEN      31354/httpd       

[[email protected] ansible]# ansible webservs -m shell -a ‘egrep "^Listen" /etc/httpd/conf/httpd.conf‘
10.0.0.65 | CHANGED | rc=0 >>
Listen 8080

最后可以看到,虽然远程主机的配置文件中的端口修改了,但实际监听的端口没有变,说明httpd没有重启

此时就需要用handlers,来监听当有类似于这样的配置文件操作变更的时候,就需要重启这样的操作,

下面修改httpd.yml中的内容

[[email protected] ansible]# cat httpd.yml
- hosts: webservs
  remote_user: root
  tasks:
  - name: install httpd packge
    yum: name=httpd state=present
  - name: configuration file for httpd
    copy: src=/etc/ansible/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: name=httpd enabled=true state=started
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

再次把httpd.conf中的端口改成808,然后再次执行

[[email protected] ansible]# egrep ‘^Listen‘ conf/httpd.conf
Listen 808
[[email protected] ansible]# ansible-playbook httpd.yml 

PLAY [webservs] ***********************************************************************************************************

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

TASK [install httpd packge] ***********************************************************************************************
ok: [10.0.0.65]

TASK [configuration file for httpd] ***************************************************************************************
changed: [10.0.0.65]

TASK [start httpd service] ************************************************************************************************
ok: [10.0.0.65]

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

PLAY RECAP ****************************************************************************************************************
10.0.0.65                  : ok=5    changed=2    unreachable=0    failed=0   

[[email protected] ansible]# ansible webservs -m shell -a ‘netstat -lntup | grep httpd‘
10.0.0.65 | CHANGED | rc=0 >>
tcp6       0      0 :::808                  :::*                    LISTEN      32212/httpd

最后可以看到,远程主机的httpd服务监听的端口已经变成了808。

vars 变量

在playbook中使用变量,可以直接在playbook中直接定义变量,也可以在其他模板中定义变量,在playbook文件中饮用

下面以httpd.yml为例,在文件中增加vars变量

[[email protected] ansible]# cat httpd.yml
- hosts: webservs
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{ package }} state=present
  - name: configuration file for httpd
    copy: src=/etc/ansible/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: name={{ service }} enabled=true state=started
  handlers:
  - name: restart httpd
    service: name={{ service }} state=restarted

从上面的定义可以看出,变量的引用是通过{{ }} 两个大括号来的

下面看下重新执行一下,看下效果

[[email protected] ansible]# ansible-playbook httpd.yml 

PLAY [webservs] ***********************************************************************************************************

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

TASK [install httpd package] **********************************************************************************************
ok: [10.0.0.65]

TASK [configuration file for httpd] ***************************************************************************************
ok: [10.0.0.65]

TASK [start httpd service] ************************************************************************************************
ok: [10.0.0.65]

PLAY RECAP ****************************************************************************************************************
10.0.0.65                  : ok=4    changed=0    unreachable=0    failed=0 

可以看到都是OK,说明变量引用成功了

setup facts 变量使用

playbook也可以直接引用facts中获取的远程主机信息的变量来使用

案例

首先来查看

[[email protected] ansible]# ansible webservs -m setup | head
10.0.0.65 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.0.0.65"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:fe07:47f6"
        ],
        "ansible_apparmor": {
            "status": "disabled"

这里就使用变量:ansible_all_ipv4_addresses 来调用使用

[[email protected] ansible]# cat test.yml
- hosts: webservs
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ ansible_all_ipv4_addresses }}" dest=/tmp/vars.ans
[[email protected] ansible]# ansible-playbook test.yml 

PLAY [webservs] ***********************************************************************************************************

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

TASK [copy file] **********************************************************************************************************
changed: [10.0.0.65]

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

[[email protected] ansible]# ansible webservs -a ‘cat /tmp/vars.ans‘
10.0.0.65 | CHANGED | rc=0 >>
["10.0.0.65"]

从上面最后输出的结果来看,变量的调用成功。

inventory 中定义变量

同样也可以在inventory中定义变量,然后在playbook中引用

案例

修改inventory文件hosts

[[email protected] ansible]# cat hosts
# This is the default ansible ‘hosts‘ file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the ‘#‘ character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

[webservs]
10.0.0.65 testvars="10.0.0.65"

[dbservs]
10.0.0.66 testvars="10.0.0.66"

上面给个主机定义了 testvars变量

下面来引用,修改playbook文件

[[email protected] ansible]# cat test.yml
- hosts: webservs, dbservs
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ ansible_all_ipv4_addresses }}\n{{ testvars }}" dest=/tmp/vars.ans
[[email protected] ansible]# ansible-playbook test.yml 

PLAY [webservs, dbservs] **************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.65]
ok: [10.0.0.66]

TASK [copy file] **********************************************************************************************************
changed: [10.0.0.66]
changed: [10.0.0.65]

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

[[email protected] ansible]# ansible all -a ‘cat /tmp/vars.ans‘
10.0.0.66 | CHANGED | rc=0 >>
[u‘10.0.0.66‘]
10.0.0.66

10.0.0.65 | CHANGED | rc=0 >>
[u‘10.0.0.65‘]
10.0.0.65

从上面最后的输出结果可以看出,引用成功。

条件测试

如果需要根据变量、facts或此前任务的执行结果来为某task执行与否的前提时要用到条件测试。

when 语句

在task后面添加when子句即可使用条件测试;when语句支持jinja2表达式语法,例如:

tasks:
- name: "shutdown Debian flavored systems"
  command: /sbin/shutdown -h now
  when: ansible_os_family == "Debian"

when 语句中还可以使用jinja2的太多filter,例如要忽略此前某语句的错误并基于其结果(failed或者sucess)运行后面指定的语句,可使用类似如下的形式:

tasks:
- command: /bin/false
  register: result
  ignore_errors: True
- command: /bin/something
  when: result | failed
- command: /bin/something_else
  when: result | success
- command: /bin/still/something_else
  when: result | skipped

此外 when语句中还可以使用facts或playbook中定义的变量。

案例

原文地址:https://www.cnblogs.com/winstom/p/9804694.html

时间: 2024-10-09 23:12:59

Ansible Playbooks 介绍 和 使用 二的相关文章

Ansible configure management--翻译(二)

一. Getting Started with Ansible Ansible is profoundly different from other configuration management tools available today. It has been designed to make configuration easy in almost every way, from its simple English configuration syntax to its ease o

ansible(六)variables(二)使用

上一篇,咱们总结了下,ansible里的variables,这东西是从哪里来的.楼主举的例子可能都比较白痴,不过重在说明原理和过程,大伙有实际需求的时候,可以弄点高深的玩玩. 说过了,variables来自哪里,那variables该咋用呢? 说起用,用可以简单的用,也可以复杂的用,简单的用variables,直接{{variable}}这样用俩大括号括起来就OK了.高深的用,就要运用的更加灵活,可以对变量进行处理,结合循环,条件选择等流程控制方法使用. 说到variables,无外乎用在俩地方

ansible运维工具(二)

ansible playbook(二) 运行palybook时 要使用ansible-playbook命令 palybook执行任务的顺序是,在第一个主机上完成第一个任务,然后在第二个主机上完成第一个任务 而不是在第一个主机上完成所有任务,然后再在第二个主机上完成所有任务,以任务为中心,在所有主机上执行 如何构建ansible的playbook Inventory Modules Ad Hoc Commands PlayBooks Tasks 任务,及调用某模块所完成的操作 Variable 变

Ansible基础介绍

Ansible是一种基于python编写的自动化批量部署工具.主要应用于批量部署应用和结合Git.Jenkins进行自动化配置管理. Ansible结构: Ansible(核心程序) 就是ansible的心脏大脑,进行各部分的协调调用. Host Invertory(主机群组) 定义了被管理的Client,例如Client的IP.域名或ssh端口等信息. Playbooks(剧本) 用于给Client执行的任务配置文件 Modules(模块) ansible的内置功能模块,例如yum模块,she

Jenkins+Ansible+Gitlab自动化部署三剑客(二)--ansible

Ansible简介 Ansible是一个开源部署工具 开发语言:python 特点:SSH协议通讯,全平台,无需编译,模块化部署管理 作用:推送Playbook进行远程节点快速部署 Ansible与Chef,Saltstack的区别 Chef Ruby语言编写,C/S架构,配置需要Git依赖,Recipe脚本编写规范,需要编程经验 Saltstack Python语言编写,C/S架构,模块化配置管理,YAML脚本编写规范,适合大规模集群部署 Ansible Python语言编写,无Client,

Ansible Playbooks学习

Ansible的Playbooks是Ansible用于配置,部署应用的结构化语言.Ansible的模块就好比shell命令,那么playbooks就好比shell脚本,在脚本中指定怎么使用哪些命令再加上一些判断语句等等. Playbooks使用YAML文件来表示执行步骤. --- - hosts: webservers   vars:     http_port: 80     max_clients: 200   remote_user: root   tasks:   - name: ens

3、Ansible playbooks

Ansible playbooks playbook是由一个或多个“play”组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲,所谓task无非是调用ansible的一个module.将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏.下面是一个简单示例. - hosts: webnodes    //webnodes定义一个主机组,表示应用的目标主机.下面定义的任务只对此组内的主

自动化运维工具ansible简单介绍

一.Ansible介绍Ansible 简单的说是一个配置管理系统(configuration management system).你只需要可以使用 ssh 访问你的服务器或设备就行.它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式.ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作.? 模块化:调用特定的模块,完成特定任务? 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块? 支持自定义模块?

(3)ansible文件介绍

ansible安装建议使用rpm安装,简单便捷容易上手,作为初学者来说是再好不过的安装方法了,安装了ansible,让我们来了解下他的目录结构,以及配置文件结构. 一. ansible目录结构介绍 shell> rpm -ql ansible | more 目录主要是以下几项/etc/ansible #配置文件目录,主要功能为inventory主机信息配置.ansible工具功能配置:/etc/ansible/ansible.cfg/etc/ansible/hosts/etc/ansible/r