Ansible Conditionals & Loops

 一、条件语句

    条件判断语句,就是根据某些变量的值来控制Ansible的执行流程。控制某些主机执行某些操作与不执行某些操作。根据某些操作结果,判断是否执行其它操作等等。

    Ansible的条件判断语句只有 when 语句,结合变量使用才能显示出它的价值。when的用法:在想要进行判断的语句下面添加when语句即可进行条件判断.

二、示例

支持判断的操作符

1、比较操作符

       ==       !=       >       >=       <       <=

2、逻辑运算符

       and       or       not

tasks:                #简单的判断
   - name: "shutdown Debian flavored systems"
     command: /sbin/shutdown -t now
     when: ansible_os_family == "Debian"
tasks:                 #组合形式的判断
  - name: "shutdown CentOS 6 and Debian 7 systems"
    command: /sbin/shutdown -t now    
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
          (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
tasks:                   #基于某些task的结果,执行相应的task
  - 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
tasks:                      #如果一些变量没有定义,可以使用Jinja2的define测试。,来执行一些操作
    - 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 undefined
tasks:               #有时一些变量的返回结果是字符串,但是你想对它做一些数学运算
  - shell: echo "only on Red Hat 6, derivatives, and later"
    when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6
---              #对是否执行一些外部任务进行条件判断
- hosts: local
  vars:
   test: true
 
  tasks:
  - name: Test test
    debug: msg="Hello When"
    when: test
 
  - include: pre.yml         #根据条件判断,是否include某个外部任务文件。
    when: test           
 
  roles:
    - { role: /home/aheahe/roles/test, when: test }   #结合条件判断,是否加载某个Role

 

可以看出条件判断主要就是结合变量使用。

循环

一、简介    

      通常一个任务会做很多事情,如创建大量的用户,安装很多包,或重复的轮询特定的步骤,直到某种结果条件为止,Ansible为我们提供了此支持。下面是关于循环的一些语句。

 

with_items     #标准循环

with_nested    #嵌套循环

with_dict          #字典循环(Looping over hashed)

with_file       #循环文件

with_fileglob    #通配符循环文件

with_together    #循环映射

with_subelements  #子元素循环

with_sequence      #生成一系列的数字

with_random_choice   #任意选择

#with_first_found      #选择第一个找到的,不会用

with_lines          #循环程序执行的输出信息with_items:{{command_result.stdout_lines}}

with_flattened      #循环列表中的列表的item

 

二、实例

---
- hosts: local                        #with_item 和 with_nested 用法
  vars:
    Sta: false
    User: [ "Aheahe","yunzhonghe" ]
  tasks:
  - name: Standard Loops
    debug: msg="{{ item.name }},{{ item.fun }}"
    with_items:                  #生成标准循环
     - { name: Loops, fun: xx }
     - { name: Conditional, fun: yy }
    when: Sta
  - name: Nested Loops
    debug: msg= "name={{ item[0] }},priv={{ item[1] }}"
    with_nested:                  #嵌套循环
     - "{{ User }}"                #这里的User 可以直接使用列表。
     - [ "Student","Engineer","Friends" ]

---
- hosts: local          #with_dict 用法
#  vars_files:
#    hash.yml
  vars:
    users:
      alice:
        name: Alice Appleworth
        telephone: 123-456-7890
      bob:
        name: Bob Bananarama
        telephone: 987-654-3210
  tasks:
  - name: Print phone records
    debug: msg="User  item.key  is  item.value.name   item.value.telephone "
    with_dict: users              #循环列表可以查看输出信息。以获取结果

 

---
- hosts: local                 #with_file 与 with_fileglob 用法。
  vars:
    test_file: false
  tasks:
  - name: test file
    shell: echo {{ item }}
    with_file:         #循环文件的内容
     - test                          #test文件里面为任意内容。
     - test1
    when: test_file
 
  - name: Test file Glob
    shell: echo {{ item }}
    with_fileglob:     #循环文件的通配符。
    - /home/aheahe/playbook/*

 

---
- hosts: local                 #with_together用法
  vars:
    alpha: [ 'a', 'b', 'c', 'd' ]
    numbers:  [ 1, 2, 3, 4 ]
    test: [ 'A', 'B', 'C', 'D' ]
  tasks:
   - debug: msg="{{ item.0 }} and {{ item.1 }} and {{ item.2 }}"
     with_together:                #循环映射信息
       - "{{alpha}}"
       - "{{numbers}}"
       - "{{test}}"

 

---
- hosts: local         #with_subelement用法
  vars:
    users:
      - name: alice
        authorized:
          - /tmp/alice/onekey.pub
          - /tmp/alice/twokey.pub
        mysql:
            password: mysql-password
            hosts:
              - "%"
              - "127.0.0.1"
              - "::1"
              - "localhost"
            privs:
              - "*.*:SELECT"
              - "DB1.*:ALL"
      - name: bob
        authorized:
          - /tmp/bob/id_rsa.pub
        mysql:
            password: other-mysql-password
            hosts:
              - "db1"
            privs:
              - "*.*:SELECT"
              - "DB2.*:ALL"
  tasks:
  - name: Test1
    shell: echo "name={{ item.name }}"
    with_items: "{{users}}"
  - name: Test2
    shell: echo "User={{ item.0.name }},key={{ item.1 }}"
    with_subelements:         #循环子元素。
    - users
    - authorized

 

---
- hosts: local
  tasks:
  - name: Learn loop sequence
    debug: msg={{ item }}
    with_sequence: start=0 end=6 stride=2

 

---
- hosts: local                 # with_random_choice 用法
  tasks:
  - name: Learn Random
    debug: msg={{ item }}
    with_random_choice:
     - "go through the door"
     - "drink from the goblet"
     - "press the red button"
     - "do nothing"

 

---
- hosts: local         #with_lines 用法
  tasks:
  - name: test result
    shell: echo {{ item }}
    with_lines: /bin/df -Th
 
- name: flattened loop demo                       #with_flatted用法
  yum: name={{ item }} state=installed
  with_flattened:
     - "{{packages_base}}"
     - "{{packages_apps}}"
----
# file: roles/foo/vars/main.yml
packages_base:
  - [ 'foo-package', 'bar-package' ]
packages_apps:
  - [ ['one-package', 'two-package' ]]
  - [ ['red-package'], ['blue-package']]

原创文章,作者:艾贺,如若转载,请注明出处:http://www.178linux.com/9446

(1)
艾贺艾贺
上一篇 2015-11-19
下一篇 2015-11-23

相关推荐

  • 03硬链接和软链接的区别和联系

    首先我们需要了解linux下硬链接以及软连接的基本概念. 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用. 软链接:也称为符号链接,新建的文件以“路径”的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件. 硬链接和软连接之间的区别: 1.硬链接和原来的文件没有什么区别,而且共享一…

    Linux干货 2016-10-20
  • lvs三种基础模型

    1: LVS-DR 模式(调度器与实际服务器都有一块网卡连在同一物理网段上)简要的网络结构如下所示 lvs-DR模型是lvs的默认模型,也是企业中用到的最多的模型    解读:直接路由模型,每个Real Server上都有两个IP:VIP和RIP,但是VIP是隐藏的,就是不能提高解析等功能,只是用来做请求回复的源IP的,Director上…

    Linux干货 2016-08-15
  • RPM与YUM安装工具介绍与初步使用、编译apache2

      RPM可以对程序 进行安装、卸载、查询、校验和维护     rpm(raedhat package mananger),一以种数据库记录的方式将需要的软件安装到linux系统的一种机制。     RPM最大的特点是将要安装的软件先编译过,并且打包成为RPM机制的安装包,通过包…

    Linux干货 2016-06-01
  • LINUX下的RPM应用

    一 前言 在进入RPM的应用前,关于可执行程序的一些基本知识有必要说明一下: 1 ABI:application binary interface,这是应用程序与系统间的协议,大家都知道同一个程序在不同的操作系统平台可能会无法执行,很大程度上就是因为ABI的不同,因此,对于可执行程序,选择对应操作系统平台是第一步 2 API:application prog…

    Linux干货 2017-04-17
  • linux中常用文本处理工具

       在linux文件系统中经常会使用到文本处理工具,这里简单介绍几种文本处理工具: 抽取文本的工具 文件内容:less和cat 文件截取:head和tail 按列抽取:cut 按关键字抽取:grep , egrep 文件查看命令:cat, tac,rev,more,less   cat命令是用户经常使用的用来查看文本…

    Linux干货 2016-08-07
  • 分析命令中含有e2fs

    分析命令中含有e2fs 目  录 1、mke2fs  2、tune2fs 3、dump2fs 4、e2fsck 这周学到了几条命令,超级纳闷为什么这些命令都带有e2fs ,看不懂。毕竟在我的认知中linux的命名大部分都是见名知义,例如history(查看历史命令),fdisk (分区),反观这些命令很长而且还是奇怪的…

    Linux干货 2017-08-20

评论列表(1条)

  • stanley
    stanley 2015-11-26 17:19

    向写书的标准努力