07_ansible, 条件选择、加载客户事件、在roles和includes上面应用’when’语句、条件导入、基于变量选择文件和模版、注册变量

这篇具有很好参考价值的文章主要介绍了07_ansible, 条件选择、加载客户事件、在roles和includes上面应用’when’语句、条件导入、基于变量选择文件和模版、注册变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

10.条件选择
10.1.When语句
10.2.加载客户事件
10.3.在roles和includes上面应用’when’语句
10.4.条件导入
10.5.基于变量选择文件和模版
10.6.注册变量

10.条件选择

转自:http://www.ansible.com.cn/docs/playbooks_conditionals.html#id3

常常来说,一个play的结果经常取决于一个变量的值,事件(从远端系统得到事件), 或者之前任务的结果.在有些情况下,这些变量的值也会取决于其他变量. 进而,可以建立多余的组基于这些主机是否符合某些条件来操控主机, Ansible 提供了很多不同选项,来控制执行流. 让我们详细看看这些都是啥.

10.1.When语句

有时候用户有可能需要某一个主机越过某一个特定的步骤.这个过程就可以简单的像在某一个特定版本的系统上 少装了一个包一样或者像在一个满了的文件系统上执行清理操作一样. 这些操作在Ansible上,若使用when语句都异常简单.When语句包含Jinja2表达式(参见:doc:playbooks_variables). 实际上真的很简单:

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

一系列的Jinja2 “过滤器”也可以在when语句中使用, 但有些是Ansible中独有的. 比如我们想忽略某一错误,通过执行成功与否来做决定,我们可以像这样:

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

我知道,在这里讨论’register’语句命令,有点过于超前,我们将会在这议长靠后一点的地方接触这个.

友情提示,如果想查看哪些事件在某个特定系统中时允许的,可以执行以下命令:

ansible hostname.example.com -m setup

提示: 有些时候你得到一个返回参数的值是一个字符串,并且你还想使用数学操作来比较它,那么你可以执行一下操作:

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

注意:
以上事例需要目标主机上安装lsb_release软件包,来返回ansible_lsb.major_release 事件.

在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

如果一个变量不存在,你可以使用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 not defined

这个机制在选择引入变量文件时有时候特别有用,详情如下.

note当同时使用whenhewith_items (详见:doc:playbooks_loops), notewhen语句对于不同项目将会单独处理.这个源于原初设计:

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

10.2.加载客户事件

加载客户自己的事件,事实上也很简单,将在:doc:developing_modules详细介绍.只要调用客户自己的事件,进而把所有的模块放在任务列表顶端, 变量的返回值今后就可以访问了:

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'

10.3.在roles和includes上面应用’when’语句

note,如果你的很多任务都共享同样的条件语句的话,可以在选择语句后面添加inlcudes语句,参见下面事例. 这个特性并不适用于playbook的inclues,只有task的 includes适用.所有的task都会被检验, 选择会应用到所有的task上面:

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

或者应用于role:

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

在系统中使用这个方法但是并不能匹配某些标准时,你会发现在Ansible中,有很多默认’skipped’的结果. 详情参见:doc:modules文档中的‘group_by’模块,你会找到更加赏心悦目的方法来解决这个问题.

10.4.条件导入

Note:
这是一个很高级但是却被经常使用的话题.当然你也可以跳过这一节.

基于某个特定标准,又是你也许在一个playbook中你想以不同的方式做同一件事. 在不同平台或操作系统上使用痛一个playbook就是一个很好的例子.

举个例子,名字叫做Apache的包,在CentOS 和 Debian系统中也许不同, 但是这个问题可以一些简单的语法就可以被Ansible Playbook解决:

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

Note:
’ansible_os_family’已经被导入到为vars_files定义的文件名列表中了.

提醒一下,很多的不同的YAML文件只是包含键和值:

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

这个具体事怎么工作的呢?如果操作系统是’CentOS’, Ansible导入的第一个文件将是’vars/CentOS.yml’,紧接着 是’/var/os_defaults.yml’,如果这个文件不存在.而且在列表中没有找到,就会报错. 在Debian,最先查看的将是’vars/Debian.yml’而不是’vars/CentOS.yml’, 如果没找到,则寻找默认文件’vars/os_defaults.yml’ 很简单.如果使用这个条件性导入特性,你需要在运行playbook之前安装facter 或者 ohai.当然如果你喜欢, 你也可以把这个事情推给Ansible来做:

# for factor
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"

Ansible中的设置方式 ———— 从任务中把参数分开,这样可避免代码中有太多丑陋嵌套if等复杂语句. 这样可以使得配置条目更加的流畅的赏心悦目———— 特别是因为这样可以尽量减少决定点。

10.5.基于变量选择文件和模版

Note:

这是一个经常永的高级话题。也可以跳过文章。

有时候,你想要复制一个配置文件,或者一个基于参数的模版. 下面的结构选载选第一个宿主给予的变量文件,这些可以比把很多if选择放在模版里要简单的多.下面的例子展示怎样根据不同的系统,例如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/

10.6.注册变量

经常在playbook中,存储某个命令的结果在变量中,以备日后访问是很有用的. 这样使用命令模块可以在许多方面除去写站(site)特异事件,据哥例子你可以检测某一个特定程序是否存在

这个 ‘register’ 关键词决定了把结果存储在哪个变量中.结果参数可以用在模版中,动作条目,或者 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’是可以访问. 这个注册了以后的结果,如果像上面展示的,可以转化为一个list(或者已经是一个list),就可以在任务中的”with_items”中使用. “stdout_lines”在对象中已经可以访问了,当然如果你喜欢也可以调用 “home_dirs.stdout.split()” , 也可以用其它字段切割:文章来源地址https://www.toymoban.com/news/detail-642267.html

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

到了这里,关于07_ansible, 条件选择、加载客户事件、在roles和includes上面应用’when’语句、条件导入、基于变量选择文件和模版、注册变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ansible上通过roles简化playbook演示介绍

    目录 一.roles介绍 1.作用 2.role的目录结构 3.role和tasks的执行优先级顺序 二.自定义一个httpd的角色 1.完整目录结构展示 2.主要的各个目录配置 (1)vars目录和templates目录 (2)tasks目录和handlers目录 (3)运行playbook测试 三.ansible galaxy安装roles 1.在线网站 2.配置roles_path 3.ansible-ga

    2024年02月08日
    浏览(36)
  • ansible-playbook roles编写lnmp剧本

    目录 集中式编写lnmp剧本 执行 分布式编写lnmp剧本 一定要设置ssh免交互  nginx mysql php  执行

    2024年02月14日
    浏览(41)
  • [Ansible系列]ansible playbook的条件语句

    目录 简介 when 1.  when的基本使用  2.   比较运算符 3.  逻辑运算符 4.   判断变量 5.  判断执行结果  6.  判断路径  7.  判断字符串  8.  判断整除  9.  其他 9.1  version  9.2   subset  9.3  superset  9.4  in  9.5  string  和 number  条件判断与block 1.  block  2.  rescue 

    2024年02月03日
    浏览(34)
  • Ansible基础五——条件语句、循环语句、handlers、任务失败处理

    可以使用item循环变量+loop模块组合使用,实现普通循环。 常用于一键操作,比如一键安装所有组件服务。 只对一个变量进行循环 1.一键停止受控机上的两个服务。 2.推荐写法,定义变量,一键启动受控机上的两个服务。 3.使用变量文件定义,停止受控机上的两个服务。 对多

    2024年02月07日
    浏览(47)
  • ansible——利用主机模式选择主机

    一:主机模式:对目标主机的一种选择方式 1.以student用户身份并使用student作为密码登录workstations 2.创建projects-host项目文件,并下载ansible配置文件 3.在 workstation上更改到/home/student/projects-host工作目录

    2024年02月06日
    浏览(35)
  • Ansible批量安装Zabbix-agnet客户端

    本文详细使用ansible批量安装Zabbix-agent,在客户端比较多,结合ansible进行批量安装,将非常重要,省时高效,并且能够加稳定 1、安装关联组件 [root@centos78 ~]# yum install gcc* pcre* -y (缺少必要组件脚本推送会报错) [root@centos78 ~]# yum install epel-release -y 2、安装ansible组件 [root@ce

    2024年02月04日
    浏览(30)
  • 数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

    录入进入房间的相关数据; 从进入时间开始计时,计算滞留房间的时间; 定时刷新数据,超过30分钟的人数,进行红色告警; 为了完整地实现上述需求,我们可以按照以下步骤开发: 前端页面设计 设计一个合适的前端页面,用于展示所有房间的信息,以及每个房间内的用户

    2024年02月08日
    浏览(44)
  • C#MQTT编程07--MQTT服务器和客户端(wpf版)

    上篇完成了winform版的mqtt服务器和客户端,实现了订阅和发布,效果666,长这样  这节要做的wpf版,长这样,效果也是帅BBBB帅,wpf技术是cs程序软件的福音。  wpf的基础知识和案例项目可以看我的另一个专栏系列文章,这里直接干搞,开发环境依然是vs2022,.netframework 4.8,mq

    2024年01月17日
    浏览(67)
  • QT 链接动态库 (静态链接 条件编译 动态加载)

    本篇文章以我实际使用过程为例,在此总结一下qt链接动态库的几种方式 使用的动态库为libzint.so,库目录为/usr/local/lib 第一种为直接将库添加到QT中,可以看成静态库 通过pro文件添加链接 在用到外部库的程序代码中直接 这样就可以直接调用外部库的中结构体与函数接口 可以

    2024年01月20日
    浏览(47)
  • FPGA中的条件选择语句——case

    FPGA中的条件选择语句——case 在FPGA设计中,条件选择语句是非常重要的语法结构。其中一种形式是case语句。case语句用于在多种条件之间进行选择,是实现组合逻辑的基本构件之一。本文将详细讲述FPGA中的case语句。 case语句的格式如下所示: 其中,expression是一个变量或表达

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包