在使用ansible做自动化运维的时候,大多数情况下都执行某些任务的时候都需要依赖某个变量的值或者是上一个任务的执行结果。如,根据facts信息中的系统版本相关的信息来确定使用哪种包管理器安装软件。Ansible提供when语句,可以控制任务的执行流程。

一个很简单的when语句的例子:

1
2
3
4
    tasks:
      - name: "shutdown Debian flavored systems"
        command: /sbin/shutdown -t now
        when: ansible_os_family == "Debian

表示当节点主机系统为Debian的时候,执行关机操作。

在符合语句中也可以使用小括号:

1
2
3
4
5
    tasks:
      - name: "shutdown CentOS 6 and 7 systems"
        command: /sbin/shutdown -t now
        when: ansible_distribution == "CentOS" and
              (ansible_distribution_major_version == "6" or ansible_distribution_major_version == "7")

在`when`语句中也可以使用过滤器。如,我们想跳过一个语句执行中的错误,但是后续的任务的执行需要由该任务是否成功执行决定:

1
2
3
4
5
6
7
8
9
10
    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

有时候需要将一个字符串的变量转换为整数来进行数字比较:

1
2
3
    tasks:
      - shell: echo "only on Red Hat 6, derivatives, and later"
        when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6

在playbooks和inventory中定义的变量都可以使用,如,需要根据一个变量的bool值决定是否执行该任务:

1
2
    vars:
      epic: true

条件语句:

1
2
3
    tasks:
        - shell: echo "This certainly is epic!"
          when: epic

或:

1
2
3
    tasks:
        - shell: echo "This certainly isn't epic!"
          when: not epic

如果引用的变量没有被定义,使用Jinja2的`defined`测试,可以跳过或者是抛出错误:

1
2
3
4
5
6
    tasks:
        - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
          when: foo is defined
     
        - fail: msg="Bailing out. this play requires 'bar'"
          when: bar is not defined

当`when`和`with_items`一起使用的时候,每个项都会单独被`when`语句处理:

1
2
3
4
    tasks:
        - command: echo {{ item }}
          with_items: [ 0246810 ]
          when: item > 5

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@web1 ~]# cat /etc/ansible/when.yml
    ---
    - hosts: webservers
      remote_user: root
      tasks:
       - command: echo {{ item }}
         with_items: [ 1,2,3,4,5,6,8,10]
         when: item > 5
    [root@web1 ~]# ansible-playbook /etc/ansible/when.yml
     
    PLAY [webservers] ************************************************************* 
     
    GATHERING FACTS *************************************************************** 
    ok: [192.168.1.65]
     
    TASK: [command echo {{ item }}] *********************************************** 
    skipping: [192.168.1.65=> (item=1)
    skipping: [192.168.1.65=> (item=2)
    skipping: [192.168.1.65=> (item=3)
    skipping: [192.168.1.65=> (item=4)
    skipping: [192.168.1.65=> (item=5)
    changed: [192.168.1.65=> (item=6)
    changed: [192.168.1.65=> (item=8)
    changed: [192.168.1.65=> (item=10)
     
    PLAY RECAP ******************************************************************** 
    192.168.1.65               : ok=2    changed=1    unreachable=0    failed=0

如果需要的话,也可以返回自定义的facts给控制节点。返回的自定义的facts变量也可以用作下个任务的执行条件:

1
2
3
4
5
    tasks:
        - name: gather site specific fact data
          action: site_facts
        - command: /usr/bin/thingy
          when: my_custom_fact_just_retrieved_from_the_remote_system == '1234'

在角色和包含中使用when

如果有多个任务都需要使用同一个条件语句控制。可以将这些任务打包到一个单独的任务文件中,然后使用`include`包含和`when`条件语句。条件语句只对包含任务文件起作用,对包含playbook文件不起作用。指定的条件语句会作用到所包含的每个任务上:

1
2
 - include: tasks/sometasks.yml
      when: "'reticulating splines' in output"

角色中使用when

1
2
3
  - hosts: webservers
      roles:
         - { role: debian_stock_config, when: ansible_os_family == 'Debian' }

注册变量

在playbook中将某个命令运行的结果保存起来,提供给后续任务使用。如,通过command模块来判断远程节点上某个文件是否存在或者通过执行某个命令的获取其返回结果,并保存起来,下个任务根据获取的变量值来决定执行的具体操作。

register关键字可以将任务执行结果保存到一个变量中,该变量可以在模板或者playbooks文件中使用:

1
2
3
4
5
6
7
8
9
10
 - name: test play
      hosts: all
     
      tasks:
     
          - shell: cat /etc/motd
            register: motd_contents
     
          - shell: echo "motd contains the word hi"
            when: motd_contents.stdout.find('hi') != -1

上边中的例子中,通过注册变量访问返回的内容,`stdout`里面保存了命令的标准输出内容。注册变量还可以使用在`with_items`中,如果其保存的内容可以转换为列表,或者内容本身就是个列表。如果命令的输出本身就是列表,可以通过`stdout_lines`访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
 - name: registered variable usage as a with_items list
      hosts: all
     
      tasks:
     
          - name: retrieve the list of home directories
            command: ls /home
            register: home_dirs
     
          - name: add home dirs to the backup spooler
            file: path=/mnt/bkspool/{{ item }} src=/home/{{ item }} state=link
            with_items: home_dirs.stdout_lines
            # same as with_items: home_dirs.stdout.split()

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@web1 ~]# cat /etc/ansible/rewith.yml
    ---
    - hosts: webservers
      remote_user: root
      tasks:
       - name: list of home dir
         command: ls /home
         register: home_dirs
       - name: add home dirs to the backup
         file: path=/tmp/back/{{ item }} src=/home/{{ item }} state=link
         with_items: home_dirs.stdout_lines
    [root@web1 ~]# ansible-playbook /etc/ansible/rewith.yml
     
    PLAY [webservers] ************************************************************* 
     
    GATHERING FACTS *************************************************************** 
    ok: [192.168.1.65]
     
    TASK: [list of home dir****************************************************** 
    changed: [192.168.1.65]
     
    TASK: [add home dirs to the backup] ******************************************* 
    changed: [192.168.1.65=> (item=1.sql)
    changed: [192.168.1.65=> (item=1youku.sql)
    changed: [192.168.1.65=> (item=liuzhenwei)
    changed: [192.168.1.65=> (item=tom)
     
    PLAY RECAP ******************************************************************** 
    192.168.1.65               : ok=3    changed=2    unreachable=0    failed=0 
    ###远程节点
    [root@db2 ~]# ll /tmp/back
    total 0
    lrwxrwxrwx. 1 root root 11 Aug  4 14:37 1.sql -/home/1.sql
    lrwxrwxrwx. 1 root root 16 Aug  4 14:37 1youku.sql -/home/1youku.sql
    lrwxrwxrwx. 1 root root 16 Aug  4 14:37 liuzhenwei -/home/liuzhenwei
    lrwxrwxrwx. 1 root root  9 Aug  4 14:37 tom -/home/tom

在ansible中when语句的使用还是比较多的,它可以用来控制playbooks中任务的执行流程。类似于程序中的条件语句一样,使得ansible可以更好的按照运维人员的意愿来对远程节点执行特定的操作。

Ansible之Playbooks的when语句的更多相关文章

  1. ansible基础-playbooks

    1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...

  2. ansible 五 playbooks剧本使用

    一.Playbook 简介 Playbooks与Ad-Hoc相比,是一种完全不同的运用Ansible的方式,而且是非常之强大的:也是系统ansible命令的集合,其利用yaml语言编写,运行过程,an ...

  3. Ansible Playbook 使用条件判断语句

    先介绍一下 gather_facts 参数,该参数用于指定在执行任务前,是否先执行 setup 模块获取主机相关信息,以便给后面的任务使用 [root@localhost ~]# ansible 19 ...

  4. 使用ansible批量管理远程服务器

    使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...

  5. Install Ansible on Mac OSX

    from: https://devopsu.com/guides/ansible-mac-osx.html and : https://devopsu.com/guides/ansible-post- ...

  6. ansible 自动化(3)

    批量执行playbooks 远程批量命令执行的另外一种方式是用playbooks:这里是playbooks的官方文档:http://docs.ansible.com/playbooks.html这里有 ...

  7. Ansible安装配置

    Ansible工具的安装与配置 Ansible基于SSH,不需要在远程端安装任何软件,只需要在管理端安装ansible及其组件即可. Ansible使用前提是已配置ssh密钥免登陆. 一.安装组件: ...

  8. ansible基础-理解篇

    1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...

  9. 自动化运维之ansible

    第三十九课 自动化运维之ansible 目录 十五. ansible介绍 十六. ansible安装 十七. ansible远程执行命令 十八. ansible拷贝文件或目录 十九. ansible远 ...

随机推荐

  1. python 爬虫001-http请求过程

    HTTP 请求流程 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HT ...

  2. 转:大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合

    虽然比较久,但是这套架构已经很成熟了,记录一下 一般数据流向,从“数据采集--数据接入--流失计算--数据输出/存储”<ignore_js_op> 1).数据采集 负责从各节点上实时采集数 ...

  3. 【zzulioj-2115】乘积最大(区间dp)

    题目描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...

  4. Flask的请求与响应

    Flask的请求与响应 1 请求相关信息 request.method # 请求方法 request.args # get 请求的参数 request.form # post请求的参数 request ...

  5. 程序员们,AI来了,机会来了,危机也来了

    程序员们,AI来了,机会来了,危机也来了 1.人工智能真的来了 纵观古今,很少有计算机技术能有较长的发展寿命,大部分昙花一现,比如:昔日的DOS.windows3.2.foxpro.delphi.80 ...

  6. HohoCoder 1184 : 连通性二·边的双连通分量(+原理证明)

    1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师 ...

  7. 安装PL/SQL客户端来访问操作步骤

    1 2 3.改变路径 4 5 6 7 8 9.选择注册机 10

  8. 使用Metaspoit攻击MS08-067

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 使用Metaspoit攻击MS08-067 MS08-067漏洞的全称为 ...

  9. CentOS虚拟机中安装VMWare Tools

    1.单击VMWare的[虚拟机]菜单,选择[安装VMWare Tools]命令 2.接着CentOS系统会自动挂载VMWare  Tools,并自动打开,如果没有打开可以自己去图形界面打开VMWare ...

  10. CSS设计取消a标签的修饰,转为文本

    用法:text-decoration:none;修饰:text-decoration的用法:http://www.runoob.com/cssref/pr-text-text-decoration.h ...