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

news2024/11/24 12:28:29

环境版本说明

  • 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: play1
  hosts: both
  tasks:
  - name: stop firewalld.service and chronyd.service
    ansible.builtin.service:
      name: "{{ item }}"		# 固定格式,表示从loop中提取列表项
      state: stopped
    loop:
      - firewalld				# loop循环列表值
      - chronyd

在这里插入图片描述

3. 循环使用单个变量

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

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

---
- name: play1
  hosts: both
  vars:				# 在变量中定义循环列表值
    servers:
    - firewalld
    - chronyd
  tasks:
  - name: stop firewalld.service and chronyd.service
    ansible.builtin.service:
      name: "{{ item }}"		# 固定格式,表示从loop中提取列表项
      state: stopped
    loop: "{{ services }}"

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

# 新建vars.yml变量文件
services:
  - firewalld
  - chronyd

# 新建playbook
---
- name: play1
  hosts: both
  vars_files: vars.yml
  tasks:
  - name: stop firewalld.service and chronyd.service
    ansible.builtin.service:
      name: "{{ item }}"
      state: stopped
    loop: "{{ services }}"

在这里插入图片描述

4. 循环字典列表

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

---
- name: play1
  hosts: serverb
  vars:
    msg:
      - name: Mike
        age: 20
      - name: Jack
        age: 18
  tasks:
  - name: Print Msg
    ansible.builtin.debug:
      msg: Print {{ item.name }} and {{ item.age }}
    loop: "{{ msg }}"

在这里插入图片描述

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

# 创建变量文件
vim for4_vars.yml

msg:
  - name: Mike
    age: 20
  - name: Jack
	age: 18
	

# 新建playlook
---
- name: play1
  hosts: serverb
  vars_files: /home/student/ansible/for4_vars.yml
  tasks:
  - name: Print Msg
    ansible.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: play1
  hosts: both
  tasks:
  - name: print msg
    ansible.builtin.debug:
      msg: Print Message
    when: 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" and
    ansible_board_vendor == "Red Hat" )
  or
  ( ansible_board_name= == "RHEL" and
    ansible_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: play1
  hosts: dev,prod
  tasks:
  - name: Install php and mariadb
    ansible.builtin.yum:
      name: "{{ item }}"		# 递归提取loop字段中的值
      state: latest
    loop:
      - php
      - mariadb

  - name: Install the 'RPM Development tools' package group
    ansible.builtin.yum:				# 安装软件包组
      name: "@RPM Development Tools"
      state: present
    when: inventory_hostname in groups.dev	# 当主机存在dev组中才执行

  - name: Upgrade all packages		# 更新所有的软件包
    ansible.builtin.yum:
      name: '*'
      state: latest
    when: 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: play1
  hosts: all
  tasks:

  - name: Copy Text for dev
    ansible.builtin.copy:
      content: "Development"
      dest: /etc/issue.yml
    when: inventory_hostname in groups.dev


  - name: Copy Text for prod
    ansible.builtin.copy:
      content: "Production"
      dest: /etc/issue.yml
    when: 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.coloradmin.cn/o/1943725.html

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

相关文章

基于单片机控制的变压器油压油温故障检测

摘 要 在电力系统的运行中&#xff0c;通过对其核心设备变压器的故障进行检测&#xff0c;以此能够及时、准确的发现变压器的故障&#xff0c;基于单片机控制的变压器油压油温的故障检测的方法&#xff0c;利用压力传感器、温度传感器对变压器的油压、油温进行采集并送入单片机…

靶机Metasploitable2的安装

Metasploitable2是一款基于Ubuntu Linux的操作系统。Metasploitable2是一个虚拟机文件&#xff0c;从网上下载解压之后就可以直接使用&#xff0c;无需安装。该系统本身设计作为安全工具测试和演示常见漏洞攻击的靶机&#xff0c;所以它存在大量未打补丁漏洞&#xff0c;并且开…

Xilinx Ultrascale+ FPGA 驱动MIPI DSI屏显示源码工程

作者&#xff1a;Hello&#xff0c;Panda 大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;我是熊猫君。 曾记否&#xff0c;之前熊猫家发了一篇博文《分享一下使用Xilinx FPGA驱动MIPI DSI屏的心路历程》&#xff0c;此文发布以后&#xff0c;后台收到了不少朋友…

Ubuntu 22.04安装Visual Studio Code(VS Code)配置C++,Python

目录 1,下载 通过命令行安装 2,配置 2.1 vscode安装C/C 2.1.1 vscode安装运行环境 3,测试 vscode测试 4&#xff0c;配置python 选择解释器Python是一个解释性语言&#xff0c;现在需告知VSCode使用哪个解释器 ctrlshiftp 输入&#xff1a;Python: Select Interprete…

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼&#xff0c;这里我惯用的就是寻找可进站的思路。这个思路分为两种&#xff0c;一是弱口令进站测试&#xff0c;二是可注册进站测试。依照这个思路&#xff0c;我依旧是用鹰图进行了一波资产的搜集&#xff…

学习笔记:MySQL数据库操作4

一、数据库和表的创建 创建数据库&#xff1a; 使用create database语句创建一个新的数据库&#xff0c;例如&#xff1a; 选择数据库&#xff1a; 使用use语句来指定后续操作的数据库&#xff0c;例如&#xff1a; 创建表&#xff1a; 使用create table语句来创建表&#xff0…

Java面试八股之后Spring、spring mvc和spring boot的区别

Spring、spring mvc和spring boot的区别 Spring, Spring Boot和Spring MVC都是Spring框架家族的一部分&#xff0c;它们各自有其特定的用途和优势。下面是它们之间的主要区别&#xff1a; Spring: Spring 是一个开源的轻量级Java开发框架&#xff0c;最初由Rod Johnson创建&…

CSS:position属性

一、属性值 1.1 fixed 固定位置的元素&#xff0c;相对于浏览器窗口进行定位。 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。 网站中的固定 header 和 footer 就是用固定定位来实现的&#xff1b; header效果图 footer效果图 1.2 absol…

“微软蓝屏”事件,给IT行业带来的宝贵经验和教训

“微软蓝屏”事件是指2024年7月19日发生的一次全球性技术故障&#xff0c;主要涉及微软视窗&#xff08;Windows&#xff09;操作系统及其相关应用和服务。 以下是对该事件的详细解析&#xff1a; 一、事件概述 发生时间&#xff1a;2024年7月19日事件影响&#xff1a;全球多个…

linux 解决端口占用

1.查询被占用的端口 netstat -tln | grep 60602.查询该端口对应的服务 lsof -i :60603.杀死该进程 //14868是第二步的PID kill -9 14868

Docker容器逃逸漏洞-CVE-2024-21626

Snyk 在 Docker 引擎以及其他容器化技术(例如 Kubernetes)使用的 runc <=1.1.11 的所有版本中发现了一个漏洞。利用此问题可能会导致容器逃逸到底层主机操作系统,无论是通过执行恶意映像还是使用恶意 Dockerfile 或上游映像构建映像(即使用时FROM) CVE-2024-21626原理…

【iOS】——属性关键字

属性关键字的类型 在iOS中属性关键字分为四种类型&#xff1a; 可访问性: readonly ,readwrite原子性 &#xff1a; atomic &#xff0c;nonatomic内存管理 &#xff1a; retain/strong/copy&#xff0c; assign/unsafe_unretained&#xff0c;weak方法命名&#xff1a;sette…

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用

MR简介 RDMA通信中MR(Memory Region)指的是由RDMA软件层在内存中规划出的一片区域&#xff0c;用于存放收发的数据。IB协议中&#xff0c;用户在申请完用于存放数据的内存区域之后&#xff0c;都需要通过调用IB框架提供的API注册MR&#xff0c;才能让RDMA网卡访问这片内存区域…

Linux常用特殊符号

1、 > 和 >> 用法 这两个符号> 和 >> 主要区别如下&#xff1a; 符号>&#xff1a;覆盖现有文件&#xff0c;如果目录中不存在上述名称的文件&#xff0c;则创建一个文件。 符号>>&#xff1a;追加现有文件&#xff0c;如果目录中不存在上述名称的文…

Qt/C++音视频开发79-采集websocket视频流/打开ws开头的地址/音视频同步/保存到MP4文件/视频回放

一、前言 随着音视频的爆发式的增长&#xff0c;各种推拉流应用场景应运而生&#xff0c;基本上都要求各个端都能查看实时视频流&#xff0c;比如PC端、手机端、网页端&#xff0c;在网页端用websocket来接收并解码实时视频流显示&#xff0c;是一个非常常规的场景&#xff0c…

达梦数据库迁移DTS表对比

达梦数据库迁移DTS表对比 背景 达梦数据库迁移mysql2dm&#xff0c;使用dts迁移后的表数据精度不对&#xff0c;需要修正。网上很难搜到&#xff0c;特此记录。 DTS对比数据 1.创建对比 2.设置源库和目标库 3.选择对比选项 4.指定模式 5.指定对象 选择添加源确定 点击配置…

AI学习记录 -使用react开发一个网页,对接chatgpt接口,附带一些英语的学习prompt

实现了如下功能&#xff08;使用react实现&#xff0c;原创&#xff09; 实现功能&#xff1a; 1、对接gpt35模型问答&#xff0c;并实现了流式传输&#xff08;在java端&#xff09; 2、在实际使用中&#xff0c;我们的问答历史会经常分享给他人&#xff0c;所以下图的 copy …

OCC 扫掠

目录 一、概述 1、扫掠类型分类 2、扫掠方式分类 二、详细介绍 1. 直线扫掠(Linear Sweep) 2. 旋转扫掠(Revolution) 3. 一般路径扫掠(General Path Sweep) 三、总结 一、概述 OpenCASCADE (OCC) 中的扫掠(Sweeping)操作是一种常用的几何建模技术,用于通过沿着…

Java文件读取 jar包内文件读取

全文详见个人博客&#xff1a;https://www.coderli.com/jar-classloader/ Java文件读取 jar包内文件读取最近遇到一些Jar包内外配置文件读取的问题。索性自己测试总结一下&#xff0c;与大家分享。 主要是关于ClassLoader.getResource和Class.getResource方法路径区别的问题。…

python:切片

Python 中的切片&#xff08;slicing&#xff09;是一种强大的功能&#xff0c;它允许你获取序列&#xff08;如列表、元组、字符串等&#xff09;的一个子集。切片操作通过指定序列的起始索引、结束索引&#xff08;可选&#xff09;和步长&#xff08;可选&#xff09;来实现…