RedHat9 | Ansible 编写循环和条件任务

环境版本说明

  • RedHat9 [Red Hat Enterprise Linux release 9.0]
  • Ansible [core 2.13.3]
  • Python [3.9.10]
  • jinja [3.1.2]

1. 利用循环迭代任务

  • 通过利用循环,管理员无需编写多个使用同一模块的任务。
  • Ansible支持使用loop关键字对一组项目迭代任务,通过配置循环以利用列表中各个项目、列表中各个文件的内容、生成的数字序列或更为复杂的结构来重复任务。

2. 简单循环

简单循环对一组项目迭代任务。loop关键字添加到任务中,将应对其迭代任务的项目列表为值。循环变量item保存每个迭代过程中使用的值。

查看当前清单文件

cat inventory

在这里插入图片描述

针对both组实现,关闭防火墙服务和时钟同步服务,playbook内容如下

---
- name: play1hosts: bothtasks:- name: stop firewalld.service and chronyd.serviceansible.builtin.service:name: "{{ item }}"		# 固定格式,表示从loop中提取列表项state: stoppedloop:- firewalld				# loop循环列表值- chronyd

在这里插入图片描述

3. 循环使用单个变量

将loop循环列表值修改为变量引用,在变量中定义要循环的列表值。

将循环列表值定义在vars字段中

---
- name: play1hosts: bothvars:				# 在变量中定义循环列表值servers:- firewalld- chronydtasks:- name: stop firewalld.service and chronyd.serviceansible.builtin.service:name: "{{ item }}"		# 固定格式,表示从loop中提取列表项state: stoppedloop: "{{ services }}"

将循环列表值定义在文件中

# 新建vars.yml变量文件
services:- firewalld- chronyd# 新建playbook
---
- name: play1hosts: bothvars_files: vars.ymltasks:- name: stop firewalld.service and chronyd.serviceansible.builtin.service:name: "{{ item }}"state: stoppedloop: "{{ services }}"

在这里插入图片描述

4. 循环字典列表

将循环列表值定义在vars字段中

---
- name: play1hosts: serverbvars:msg:- name: Mikeage: 20- name: Jackage: 18tasks:- name: Print Msgansible.builtin.debug:msg: Print {{ item.name }} and {{ item.age }}loop: "{{ msg }}"

在这里插入图片描述

将循环列表值定义在文件中

# 创建变量文件
vim for4_vars.ymlmsg:- name: Mikeage: 20- name: Jackage: 18# 新建playlook
---
- name: play1hosts: serverbvars_files: /home/student/ansible/for4_vars.ymltasks:- name: Print Msgansible.builtin.debug:msg: Print {{ item.name }} and {{ item.age }}loop: "{{ msg }}"

在这里插入图片描述

5. 有条件的运行任务

  • Ansible可以使用 conditionals 在符合特定条件时运行任务或Play。例:可以使用条件在Ansible安装或配置某个服务之前,确定受管主机上的可用内存。
  • 条件语句可以帮助区分不同的受管主机,并根据所符合的条件来分配功能角色。
  • Playbook变量、注册的变量和Ansible事实都可以通过条件句来进行测试。
  • 可以比较字符串、数字数据和布尔值的运算符

when判断语句

  • when判断对象是模块,和模块在同一层次
  • when判断当前模块是否执行,而非判断它下级模块是否执行
  • when中引用变量、facts,不需要添加{{}}
  • 用于测试条件中相等的==运算符不可与变量赋值=运算符混淆
  • 一个when语句可用于评估多个值,通过使用andor关键字组合,或使用括号分组条件

简单示例

---
- name: play1hosts: bothtasks:- name: print msgansible.builtin.debug:msg: Print Messagewhen: inventory_hostname == 'serverc'		# 限定主机名为serverc

在这里插入图片描述

条件示例

表达式作用
inventory_hostname == “serverc”等于(值为字符串)
Mtu == 1500等于(值为数字)
Mtu < 1500小于
Mtu > 1500大于
Mtu >= 1500大于等于
Mtu <= 1500小于等于
Mtu != 1500不等于
Min_memory is defined变量存在
Min_memory is undefined变量不存在
Min_memory is not defined变量不存在
inventory_hostname in group.both第一个变量存在,且在第二个变量内,类似
Python中的 ‘Mike’ in [‘Mike’,‘Jack’]

多条件示例:or是或的关系,任意一个条件为真即可

when: ansible_board_name= == "RHEL" and ansible_board_vendor == "Red Hat"

多条件实例:and是与的关系,全部条件都满足为真

# 第一种方式
when: ansible_board_name= == "RHEL" and ansible_board_vendor == "Red Hat"# 第二种方式
when: - ansible_board_name= == "RHEL"- ansible_board_vendor == "Red Hat"

与或嵌套语句书写

when: >( ansible_board_name= == "RHEL" andansible_board_vendor == "Red Hat" )or( ansible_board_name= == "RHEL" andansible_board_vendor == "CentOS")

6. 综合练习1

案例需求

  • 创建一个名为 inventory 的主机清单
  • 创建主机组 dev,包含serverb
  • 创建主机组 prod,包含serverc、serverd
  • 创建一个名为 /home/student/ansible/packages.yml 的palybook
  • 将 php 和 mariadb 软件包安装到 dev、test、prod 主机组中
  • RPM Development Tools 软件包组 安装到 dev 主机组中的主机上
  • dev 主机组中的主机上的所有软件包更新为最新版本

[Step1]:创建主机清单

vim inventory# 写入下列内容
[dev]
serverb[prod]
serverc
serverd

[Step2]:验证条件语句:通过查看group_names魔法变量可以看到主机所在的驱主机组

ansible serverb -m debug -a var=group_names

在这里插入图片描述

[Step3]:编写playlook

vim package.yml# 写入下列内容
---
- name: play1hosts: dev,prodtasks:- name: Install php and mariadbansible.builtin.yum:name: "{{ item }}"		# 递归提取loop字段中的值state: latestloop:- php- mariadb- name: Install the 'RPM Development tools' package groupansible.builtin.yum:				# 安装软件包组name: "@RPM Development Tools"state: presentwhen: inventory_hostname in groups.dev	# 当主机存在dev组中才执行- name: Upgrade all packages		# 更新所有的软件包ansible.builtin.yum:name: '*'state: latestwhen: inventory_hostname in groups.dev	# 当主机存在dev组中才执行

[Step4]:校验playlook语法

ansible-navigator run package.yml -m stdout --syntax-check

在这里插入图片描述

[Step4]:运行playlook

ansible-navigator run package.yml -m stdout

在这里插入图片描述

7. 综合练习2

修改文件内容

  • 按照下方所述,创建一个名为 /home/greg/ansible/issue.yml的 playbook

  • 该 playbook 将在所有清单主机上运行,主机清单引用综合练习1清单

  • 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:

  • 在 dev 主机组中的主机上,这行文本显示 为:Development

  • 在 prod 主机组中的主机上,这行文本显示 : Production

[Step1]:分别在三台主机上创建/etc/issue文件

ssh root@serverb "echo 111 > /etc/issue"
ssh root@serverc "echo 111 > /etc/issue"
ssh root@serverd "echo 111 > /etc/issue"

在这里插入图片描述

[Step2]:编写playbook

vim issue.yml# 写入下列内容
---
- name: play1hosts: alltasks:- name: Copy Text for devansible.builtin.copy:content: "Development"dest: /etc/issue.ymlwhen: inventory_hostname in groups.dev- name: Copy Text for prodansible.builtin.copy:content: "Production"dest: /etc/issue.ymlwhen: inventory_hostname in groups.prod

[Step4]:校验playlook语法

ansible-navigator run issue.yml -m stdout --syntax-check

在这里插入图片描述

[Step5]:运行playbook

ansible-navigator run issue.yml -m stdout

[Step6]:验证:查看所有主机的文件内容

ssh root@serverb "cat /etc/issue.yml"
ssh root@serverc "cat /etc/issue.yml"
ssh root@serverd "cat /etc/issue.yml"

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频入门基础:WAV专题(3)——FFmpeg源码中,判断某文件是否为WAV音频文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.wav 可以判断出某个文件是否为WAV格式的音频文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为WAV格式的音频文件呢&#xff1f;它内部其实是通过wav_probe函数来判断的。从文章《FFmpeg源码&#xff1a;av_prob…

Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附水印

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)

注&#xff1a;另一种方式参考 关于TableField中TypeHandler属性&#xff0c;自定义的类型处理器的使用&#xff08;密码加密与解密举例&#xff09;http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前&#xff0c;我们可以先了解一下什么是序列化与反序列…

遵义网站建设安全性保证

随着互联网的发展和普及&#xff0c;网站的建设成为了一个重要的工作&#xff0c;也是企业宣传的重要渠道。然而&#xff0c;随之而来的安全问题也是不容忽视的。为了保证遵义网站建设的安全性&#xff0c;我们需要采取一系列的措施。 首先&#xff0c;要选择合适的服务器和主机…

【Unity2D 2022:Data】读取csv格式文件的数据

一、创建csv文件 1. 打开Excel&#xff0c;创建xlsx格式文件 2. 编辑卡牌数据&#xff1a;这里共写了两类卡牌&#xff0c;第一类是灵物卡&#xff0c;具有编号、卡名、生命、攻击四个属性&#xff1b;第二类是法术卡&#xff0c;具有编号、卡名、效果三个属性。每类卡的第一…

(39)智能电池

文章目录 前言 1 通过任务规划器进行设置 2 补充信息 3 限制条件 4 参数说明 前言 虽然还不是很普遍&#xff0c;但智能电池更容易从飞行器上安装和拆卸&#xff0c;并且能够提供更多关于电池状态的信息&#xff0c;包括容量、单个电池电压、温度等。 ArduPilot 支持几种…

开发环境搭建——Node.js

在启动前端项目的时候我们通常会用到Node.js&#xff0c;下面是对Node.js的下载安装以及配置的讲解 一、Node.js的安装 1.1、通过Node.js官网下载&#xff1a;Node.js — Run JavaScript Everywhere 下载后双击.msi安装文件后一直点击下一步即可 1.2、配置node 1.2.1、查看…

js 替换json中的转义字符 \

例如有以下字符串 "\"{\\\"account\\\":\\\"66\\\",\\\"name\\\":\\\"66\\\"}\"" 想得到如下字符串 {"account":"66","name":"66"} 执行替换字符串 "\"{…

组队学习——决策树(以泰坦尼克号公共数据集为例)

本次我们挑战的数据集为泰坦尼克号公共数据集&#xff0c;为了降低难度&#xff0c;我们在原有数据集的基础上进行了优化&#xff0c;具体数据集介绍如下&#xff1a; 在这里也介绍一下数据的含义吧 数据介绍&#xff1a; Survived&#xff1a;是否存活&#xff08;label&#…

paraFoam 运行 报错 usr/lib/x86_64-linux-gnu/libQt5Core.so 已解决

在日常项目开发中。使用ubuntu 视图开发的时候。报错 缺少 libQt5Core 核心组件&#xff01; whereis libQt5Core.so.5sudo strip --remove-section.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 完美解决&#xff0c;并且能正常打开&#xff0c;前提是&#xff0c…

【python】python生活管理费系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

加载chatglm3模型时出现ValueError: too many values to unpack (expected 2)的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于Libero的工程创建

基于Libero的工程创建 第一步&#xff1a;双击进入到工程界面&#xff0c;编写项目详细信息。 Project Name&#xff1a;标识您的项目名称。不要使用空格或保留的Verilog或VHDL关键字。 Project Location&#xff1a;在磁盘上标识您的项目位置。 Description&#xff1a;关于…

Linux系统下安装MySQL

前言&#xff1a; 本篇教程是使用Centos8来进行安装部署&#xff0c;如果使用的Linux系统发行版不同安装部署过程中可能会有差异&#xff0c;相同环境下可以跟着操作流程进行部署。本篇文章的主要目的是为了学习分享使用如有疑问欢迎提出并共同讨论。 1、安装前的准备工作 移除…

Power App学习笔记以及基础项目管理demo

Power App学习笔记以及基础项目管理demo 最近学习了一点Power App&#xff0c;感觉挺有意思。配置式组件开发。浅浅记录一下自己实现的项目管理系统&#xff08;即Excel数据的增删改查&#xff09;关于函数的一点皮毛认识。 效果图 筛选数据 编辑 详情 数据源 PowerApp 网…

SpringCloud - Nacos配置中心、命名空间

一、 Nacos配置中心 1、在gulimall-common公共模块添加依赖 <!--服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--…

为RTEMS Raspberrypi4 BSP添加SPI支持

为RTEMS Raspberrypi4 BSP添加SPI支持 主要参考了dev/bsps/shared/dev/spi/cadence-spi.c RTEMS 使用了基于linux的SPI框架&#xff0c;SPI总线驱动已经在内核中实现。在这个项目中我需要实习的是 RPI4的SPI主机控制器驱动 SPI在RTEMS中的实现如图&#xff1a; 首先需要将S…

day06 项目实践:router,axios

vue组件的生命周期钩子 今天几乎没有讲什么新内容&#xff0c;就是一起做项目&#xff0c;只有一个小小的知识点&#xff0c;就是关于vue组件的生命周期钩子&#xff0c;其中最重要的四个函数—— beforeCreate()&#xff1a;组件创建之间执行 created()&#xff1a;组件创建…

[Meachines] [Easy] Admirer Adminer远程Mysql反向+Python三方库函数劫持权限提升

信息收集 IP AddressOpening Ports10.10.10.187TCP:21,22,80 $ nmap -p- 10.10.10.187 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u7 (protocol 2.0) | ssh-hostkey: | …

前端三大主流框架对比

在现代前端开发中&#xff0c;React、Vue和Angular是三大流行的框架/库。它们各自有独特的优缺点&#xff0c;适用于不同的开发需求和项目规模。下面是对这三者的详细比较&#xff1a; 一、 React 简介&#xff1a; 由Facebook开发和维护&#xff0c;是一个用于构建用户界面…