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 nowwhen: ansible_os_family == "Debian"
一系列的Jinja2 “过滤器”也可以在when语句中使用, 但有些是Ansible中独有的. 比如我们想忽略某一错误,通过执行成功与否来做决定,我们可以像这样:
tasks:- command: /bin/falseregister: resultignore_errors: True- command: /bin/somethingwhen: result|failed- command: /bin/something_elsewhen: result|success- command: /bin/still/something_elsewhen: 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 dataaction: site_facts- command: /usr/bin/thingywhen: 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.ymlwhen: "'reticulating splines' in output"
或者应用于role:
- hosts: webserversroles:- { 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: allremote_user: rootvars_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 filetemplate: src={{ item }} dest=/etc/myapp/foo.confwith_first_found:- files:- {{ ansible_distribution }}.conf- default.confpaths:- search_location_one/somedir/- /opt/other_location/somedir/
10.6.注册变量
经常在playbook中,存储某个命令的结果在变量中,以备日后访问是很有用的. 这样使用命令模块可以在许多方面除去写站(site)特异事件,据哥例子你可以检测某一个特定程序是否存在
这个 ‘register’ 关键词决定了把结果存储在哪个变量中.结果参数可以用在模版中,动作条目,或者 when 语句. 像这样(这是一个浅显的例子):
- name: test playhosts: alltasks:- shell: cat /etc/motdregister: 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()” , 也可以用其它字段切割:
- name: registered variable usage as a with_items listhosts: alltasks:- name: retrieve the list of home directoriescommand: ls /homeregister: home_dirs- name: add home dirs to the backup spoolerfile: path=/mnt/bkspool/{{ item }} src=/home/{{ item }} state=linkwith_items: home_dirs.stdout_lines# same as with_items: home_dirs.stdout.split()
相关文章:
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的…...
4个简化IT服务台任务的ChatGPT功能
最近几个月,ChatGPT 风靡全球,这是一个 AI 聊天机器人,使用户能够生成脚本、文章、锻炼图表等。这项技术在各行各业都有无穷无尽的应用,在本文中,我们将研究这种现代技术如何帮助服务台团队增强服务交付和客户体验。 什…...
群晖7.X版安装cpolar内网穿透
群晖7.X版安装cpolar内网穿透套件 文章目录 群晖7.X版安装cpolar内网穿透套件前言1. 下载cpolar的群晖系统套件1.1 在“套件中心” 选择“手动安装”1.2 完成套件安装 2. 进入cpolar软件信息页3. 点击“免费注册”轻松获得cpolar账号 前言 随着群晖系统的更新换代,…...
[保研/考研机试] KY183 素数 北京航空航天大学复试上机题 C++实现
题目链接: 素数https://www.nowcoder.com/share/jump/437195121691718444910 描述 输入一个整数n(2<n<10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。 输入描述: 输入有多…...
Java基础入门篇——IDEA开发第一个入门程序(五)
目录 一、IDEA层级结构分类 二、IDEA层级结构介绍 三、IDEA层级关系 四、创建IDEA中的第一个代码 一、IDEA层级结构分类 IntelliJ IDEA的项目结构主要分为以下几个层级: Project: 项目Module: 模块Package: 包Class: 类 一个项目里面…...
系统学习Linux-Redis基础
一、redis概述 NoSQL(非关系型数据库、内存存储) 类型 文档型数据库(Document-oriented database)如MongoDB; 列族数据库(Column-family database)如HBase、Cassandra等; 图形数…...
实现缓存el-table分页大小,用户新建标签打开该页面需保持分页大小(考虑是否为嵌入式页面)
需求:每个表格的分页大小 以本地缓存的方式存到浏览器本地,然后用户下次打开的时候 获取这个本地存储的值 如果没有就用页面默认的值,如果有 则先判断是不是有效的(是) 无效用默认 有效就用这个缓存值,需要区分是否为嵌入式页面 分析…...
056B R包ENMeval教程-基于R包ENMeval对MaxEnt模型优化调参和结果评价制图(更新)
056B-1 资料下载 056B-2 R包ENMeval在MaxEnt模型优化调参中的经典案例解读 056B-3 R软件和R包ENMeval工具包安装 056B-4 R软件和R包ENMeval安装报错解决办法 056B-5 环境数据格式要求和处理流程 056B-6 分布数据格式要求和处理流程 056B-7 基于R包ENMeval对MaxEnt模型优化…...
MySQL_数据库的DDL语句(表的创建与修改)
DDL 数据库操作 查看当前有哪些数据库 SHOW databases;#查看哪些数据库查询当前数据库 SELECT database();创建数据库 create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ] ;创建一个sycoder数据库, 使用数据库默认的字符集 CREATE…...
常见面试题:字节序判别和转换
在计算机中,字节序指的是多字节数据的存储顺序。最常见的字节序有两种:大端字节序(Big-Endian)和小端字节序(Little-Endian)。 大端字节序是指最高有效位(Most Significant Bit,简称…...
Maxwell与canal工具对比
Maxwell和Canal是两种不同的数据同步工具,都是在数据迁移、数据同步、数据分发等领域发挥作用的工具,但是它们之间存在一些差异。 Maxwell Maxwell是一种开源的MySQL数据库同步工具,它可以将MySQL数据库的binlog转化为JSON格式,…...
SpringBoot——如何运行Python脚本并返回数据
文章目录 运行python脚本并输出如何输入参数 运行python脚本并输出 要让Python脚本返回数据给调用它的Java代码,你可以在Python脚本中使用打印或输出函数将结果输出到标准输出(stdout)中。 以下是一个示例,在Python脚本中返回数…...
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
R语言初学者书籍推荐
Home | Bookdown 这个网站上有很多R语言的书籍,并且一直在更新,阅读起来没有难度。 今天搜索材料的时候,检索到下面这本书: 有输入,才会有输出。...
Taro+Vue3,点击按钮把另一个页面分享出去
useShareAppMessage 监听用户点击页面内转发按钮(Button 组件 openTypeshare)或右上角菜单“转发”按钮的行为,并自定义转发内容。等同于 onShareAppMessage 页面生命周期钩子。 使用时,必须为页面配置 enableShareAppMessage…...
CSS基础:学习CSS样式的基本语法和应用,了解如何美化网页。
CSS(层叠样式表)是一种用于描述网页上元素(例如文字、图像、背景等)外观和布局的样式语言。通过使用CSS,您可以控制和改变网页的外观,使其更具吸引力和易于使用。 下面是一些CSS基础知识和常用的语法&#…...
MySQL语句总和之表数据操作(增删改查)
目录 1、增加 insert into 表 (字段1, 字段3, 字段5) values(value1, value2, value3) insert into 表 [(字段1, 字段2, 字段3....)] values(value1, value2,value3.....)[,(value1, value2, value3....) .....] i…...
HDFS中snapshot快照机制
HDFS中snapshot快照机制 介绍作用功能实现相关命令和操作相关命令 介绍 snapshot是数据存储的某一时刻的状态记录,备份(backup)则是数据存储的某一个时刻的副本HDFS snapshot快照是整个文件系统或某个目录在某个时刻的镜像,该镜像…...
YOLOv5基础知识入门(5)— 损失函数(IoU、GIoU、DIoU、CIoU和EIoU)
前言:Hello大家好,我是小哥谈。使用YOLOv5训练模型阶段,需要用到损失函数。损失函数是用来衡量模型预测值和真实值不一样的程度,极大程度上决定了模型的性能。本节就给大家介绍IoU系列损失函数,希望大家学习之后能够有…...
Centos7源码安装redis
1、下载redis Index of /releases/ 2、解压redis tar -xvf redis-6.2.9.tar.gz 3、进入解压后的目录 cd redis-6.2.9/4、指定内存分配器为 libc make MALLOClibc 5、进入src目录,安装 cd src && make install6、运行 ./redis-server 7、添加开机…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
