首页 > 其他分享 >Ansible的条件语句【转】

Ansible的条件语句【转】

时间:2023-01-03 16:03:50浏览次数:39  
标签:语句 tasks name when 如下 Ansible 条件 ansible yml

Ansible的条件语句

1、    前言

在有的时候play的结果依赖于变量、fact或者是前一个任务的执行结果,从而需要使用到条件语句。

2、    When语句

有的时候在特定的主机需要跳过特定的步骤,例如在安装包的时候,需要指定主机的操作系统类型,或者是当操作系统的硬盘满了之后,需要清空文件等

         下面的例子表示为使用when语句,如下:

tasks:

  - name: "shutdownDebianflavoredsystems"

    command: /sbin/shutdown -t now

    when: ansible_os_family == "Debian"

         也可以使用括号来表示一组条件,如下所示:

tasks:
  - name: "shutdownCentOS6andDebian7systems"
    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")

         假设需要忽略一个语句的错误,根据执行的结果是成功还是失败从而执行不同的命令,如下(使用的是jinja2的过滤):

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

         当接收到一个变量是一个字符串的时候,然后想做一个数字的比较,那么可以使用如下的方式(在这个例子中远程主机上需要有lsb_package包):

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清单中定义的变量也是可以使用,假设任务的执行依赖于一个布尔变量,如下:

vars:
  epic: true

         条件执行如下所示:

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

         或者使用如下形式:

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

         如果需要的变量没有定义,那么可以skip或者使用jinja2的defined如下所示:

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 undefined

         当结合使用when和with_items的时候,需要注意的是when语句会对每个item进行单独的处理,如下所示:

tasks:
    - command: echo {{ item }}
      with_items: [ 0,2,4,6,8,10 ]
      when: item > 5

3、    在roles中和include中使用when

当几个任务都是使用相同的条件的时候,那么可以将条件写在include之中,那么当写在include的时候,每个任务都会去判断条件,如下所示:

- include: tasks/sometasks.yml
  when: "'reticulatingsplines'inoutput"

         或者在roles中使用,如下:

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

4、    条件导入

在playbook中可能会根据一些特定的标准从而做不同的事情,在一个playbook中工作在不同的平台和os版本是最好的例子

         如下的例子表示,在centos和debian中apache的包是不同的,从而可以使用以下:

---
- hosts: all
  remote_user: root
  vars_files:
    - "vars/common.yml"
    - [ "vars/{{ansible_os_family}}.yml","vars/os_defaults.yml" ]
  tasks:
  - name: make sure apache is running
    service: name={{ apache }} state=running

         另外,在变量文件中只包含key和values,如下:

---
# for vars/CentOS.yml
apache: httpd
somethingelse: 42

         如何工作的呢 ?当操作系统为centos的时候,那么会加载变量/vars/centos.yml,当文件不存在的时候,那么会加载defaults.yml,当没有找到任何文件的时候,那么就会出错。当操作系统为debian的时候,那么就会加载变量/vars/debian.yml,没有就加载defaults.yml

         当使用整个功能的时候,在运行playbook之前必须先安装facter或者ohai,也可以直接在playbook中使用如下所示:

# for facter
ansible -m yum -a "pkg=facter state=present"
ansible -m yum -a "pkg=ruby-json state=present"
 
# for ohai
ansible -m yum -a "pkg=ohai state=present"

5、    基于变量选择文件和模板

在有的时候,配置文件使用copy或者是template的时候,可能会依赖于变量。

下面的例子中表示使用template输出一个配置文件,在centos和debian中不同,如下:

- name: template a file
  template: src={{ item }} dest=/etc/myapp/foo.conf
  with_first_found:
    - files:
       - {{ ansible_distribution }}.conf
       - default.conf
      paths:
       - search_location_one/somedir/
       - /opt/other_location/somedir/

6、    注册变量

在playbook中可以使用变量的值便于其他的任务用到。

关键字register用来保存变量值,整个变量可以使用在template中,动作行中,或者是when语句中,如下所示:

- 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得到,如下所示:

- 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()

 

转自

Ansible的条件语句 - 走看看
http://t.zoukankan.com/kellyseeme-p-5525077.html

标签:语句,tasks,name,when,如下,Ansible,条件,ansible,yml
From: https://www.cnblogs.com/paul8339/p/17022488.html

相关文章

  • 软件开发入门教程网 之MySQL DELETE 语句
        ......
  • js 语句
    //try...catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。//try如果出现以下情况,catch就抛出一个异常问题所在try{nonExistentFunction();......
  • 基于linux下的shell中常用的控制语句
    学习目标:for语句while语句if语句case语句expect语句exitbreakcontinue退出命令的区别:exit直接退出当前脚本break仅仅退出本次循环continue退出本次循环进行下一次循......
  • [概率论与数理统计]笔记:1.4 条件概率
    1.4条件概率条件概率样本空间\(\Omega\)事件\(A,B\)\(P(B)>0\)在事件\(B\)已经发生的前提条件下,事件\(A\)发生的概率称为A对B的条件概率:\(P(A|B)\).通常,\(P(A)\)......
  • clickhouse常用SQL语句,查询、建表、数据复制迁移、删除等
    clickhouse常用SQL语句,查询、建表、数据复制迁移、删除等坚持是一种态度于2022-02-1817:58:35发布1646收藏6分类专栏:数据库及存储技术大数据开发文章标签:sql......
  • 3.1-分支语句
    3.1分支语句对于需要先做判断,再选择如何处理的问题就要使用分支语句。3.1.1单分支语句语法:if布尔表达式{//左花括号必须与表达式同行//在布尔表达式为tru......
  • 分支语句与循环语句
    C语言是一门结构化的程序设计语言。什么是语句?由分号;隔开的就是一条语句分支语句(选择结构)if语句if(表达式)语句;if(表达式)语句1;else语句2;if(表达式1)语......
  • 初识JavaScript-概念,注释,js输入和输出语句
    初识JavaScript目录初识JavaScript1.初识JavaScript1.1JavaScript是什么1.1JavaScript是什么1.2JavaScript的作用1.3HTML/CSS/JS的关系1.4浏览器执行JS简介......
  • java-流程控制语句
    目录顺序分支if判断if格式1if格式2if格式3switch选择case穿透:即没有break的case语句!补充:if和switch的使用说明!流程for循环*while循环*for与while的区别do...while循环顺......
  • Ansible register 变量详解【转】
    编写playbook,我们通过 whoami 这个shell命令去查看当前登录的用户,并将结果赋值给register变量user,然后通过debug模块输出user变量的信息;it@workstation:~/an......