Ansible非标记语言YAML与任务剧本Playbook

前言

上篇介绍了 Ansible 单模块(AD-Hoc)的相关内容Ansible自动化运维Inventory与Ad-Hoc-CSDN博客,Ad-Hoc 命令是一次性的、即时执行的命令,用于在远程主机上执行特定任务,这些命令通常用于快速执行简单的任务。当需要在执行多个任务、配置复杂场景或需要可重复使用操作时,就需要用到任务剧本(Playbook)来定义复杂的任务流程和处理重复执行的操作。

Playbook 也通常被大家翻译成剧本。可以认为它是 Ansible 自定义的一门语言(可以将 Playbook 比作 Linux 中的 shell,而 Ansible 中的 Module 可以比作为 Linux 中的各种命令。

目录

前言

一、YAML 非标记语言

1. 概述介绍

2. Yaml 特点

3. 基本语法

3.1 字符串

3.2 列表

3.3 字典

3.4 混合结构 

3.5 验证YAML语法

二、Playbook

1. Paly 的定义

2. Play 属性 

3. tasks 属性中任务的多种写法

4. 具有多个 Play 的格式

5. Playbook 校验与执行

5.1 语法检验

5.2 列出任务

5.3 列出主机

5.4 单步跟重调试 

5.5 测试运行

5.6 执行

6. 编写 Playbook

7. Handlers 组件


一、YAML 非标记语言

1. 概述介绍

YAML(YAML Ain't Markup Language) 是一种人类可读的数据序列化格式,常用于配置文件和数据传输。它以缩进、换行和符号结构来表示数据,具有简洁、清晰的特点。YAML 旨在成为一个易于阅读和编写的数据格式,同时也适合机器解析和生成。它使用空格缩进来表示层级关系,不需要显式的标记符号(如 XML 或 JSON 中的尖括号或大括号),这使得它更加直观和易读。

YAML 官方网站:The Official YAML Web Site

Ansible 官网:YAML Syntax — Ansible Documentation

2. Yaml 特点

YAML文件

  • 以 #为注释符
  • 以 .yml 或者 .yaml 结尾
  • 以 --- 开始,以 ... 结束,但开始和结束标志都是可选的

3. 基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时是使用Tab键还是使用空格一定要达到统一,建议使用空格,
  • 相同层级的元素必须左侧对齐即可

 YAML 支持的数据结构有三种:

  • 字符串
  • 列表
  • 字典

3.1 字符串

---
# YAML 中的字符串可以不使用引号,即使里面存在空格的时候,当然了使用单引号和双引号也可以
this is a string
'this is a string'
"this is a string"
# YAML 中若一行写不下要表述的内容,可以进行折行。写法如下:
long line: |
Example 1
Example 2
Example 3
# 或者
long line: >
Example 1
Example 2
Example 3
...

3.2 列表

在 YAML 中,列表使用短横线 - 表示,后面跟着一个空格。列表可以包含任意类型的元素,例如字符串、数字、布尔值或者其他嵌套的列表。

---
#可以认为它就是 python 中的 List,可以认为它是 c 语言中的数组。
# 如何定义:以短横线开头 + 空格 + 具体的值
- red
- green
- blue
# 以上的值假如转换成 python 的 List 会是这样:
# ['red', 'green', 'blue']
...

3.3 字典

字典在 YAML 中使用键值对的形式表示,使用冒号 : 将键和值分隔开,键值之间需要有一个空格。字典可以包含嵌套的字典或者列表作为值。

---
# 可以认为它就是 python 中的 Dict
# 如何定义:key + 冒号(:) + 空格 + 值(value),即 key:value
name: Using Ansible
code: D1234
#转换为 python 的 Dict
#{'name': 'Using Ansibel','code': 'D1234'}
...

3.4 混合结构 

但在日常生产中,往往需要的数据结构会特别复杂,有可能会是字符串、列表、字典的组合形式。这里举一个例子:学校里是以班级为单位。我们去使用列表和字典的形式去描述一个班级的组成。

---
class:- name: stu1num: 001- name: stu2num: 002- name: stu3num: 003
#{'class': [{'name': 'stul, 'num': 1},{'name': 'stu2', 'num': 2), ...]}
...

3.5 验证YAML语法

//将 YAML 文件,通过 Python 的 YAM 模块验证,若不正确则报错。若正确则会输出 YAML 里的内容。
//注意使用时,一定确保安装了 yaml 软件包,
python -c 'import yaml,sys; print yaml.load(sys.stdin)' < myyaml.yml
python3 -c 'import yaml,sys; print(yaml.load(sys.stdin)) < myyaml.yml

示例:

# cat myyaml.yml
---
- red
- geen
- blue
...
#python -c 'import yaml,sys; print yaml.save_load(sys.stdin)' < myyaml.yml
['red', 'green', 'blue']

在 Ansible Playbooks 中,列表和字典通常用来定义变量、任务、主机清单等信息。它们提供了一种直观且易读的方式来表示复杂的数据结构,使得编写和维护 Playbooks 更加方便和直观。

二、Playbook

1. Paly 的定义

由于 playbook 是由一个或者多个 play 组成,如何定义一个 play 呢?
1、每一个 play 都是以短横杠开始的
2、每一个 play 都是一个YAML 字典格式

格式结构:

---
- keyl: value1
- key2: value2
- key3: value3
...

 多个Play结构:

---
- keyl: value1key2: value2key3: value3
- key4: value1key5: value2key6: value3
- key7: value1key8: value2key9: value3
...

2. Play 属性 

Play 中的每一个 key,比如 key1,key2 等;这些 key 在 PlayBook 中被定义为 Play 的属性。
这些属性都具有特殊的意义,我们不能随意的自定义 Play 的属性。

常用属性:

  • name 属性:每个play的名字
  • hosts 属性:每个play涉及的被管理服务器,同 ad-hoc 中的资产选择器
  • tasks 属性:每个play 中具体要完成的任务,以列表的形式表达
  • become 属性:如果需要提权,则加上become相关属性
  • becomekuser 属性:若提权的话,提权到哪个用户上
  • remote_user 属性:指定连接到远程节点上的用户,即远程服务器上执行操作的用户。若不指定,则默认使用当前执行 ansible Playbook 的用户

3. tasks 属性中任务的多种写法

# 以启动 apache 服务,并增加开机启动为例
#一行的形式:
service: name=apache enabled=true state=started
#多行的形式:
sefvice: name=apacheenabled=truestate=started
#多行写成字典的形式:
service:name: apacheenabled: truestate: started

4. 具有多个 Play 的格式

---
- name: manage web servershosts: webserverremote_user: roottasks :- name: install apache packageyum: name=httpd state=present- name: copy apache confcopy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf- name: ensure apache is running start nginx serverservice: service: name=httpd state=started enabled=yes- name: manager db servershosts: dbserverstasks:- name update database confgcopy :src=my.cnf dest=/etc/my.cnf
...

5. Playbook 校验与执行

5.1 语法检验

ansible-playbook apache.yaml  --syntax-check

5.2 列出任务

ansible-playbook apache.yaml --list-tasks

5.3 列出主机

ansible-playbook apache.yaml --list-hosts

5.4 单步跟重调试 

执行 tasks 中的任务,需要手动确认是否往下执行。

ansible-playbook apache.yaml --step

5.5 测试运行

会执行完整的 Playbook,但是所有 task 中的行为都不会在远程被管理节点服务器上执行,所有的操作都是模拟。

ansible-playbook apache.yaml --C  #大写的C

5.6 执行

ansible-playbook apache.yaml

6. 编写 Playbook

批量安装apache

① 准备工作,卸载目标主机网站服务

管理节点:
[root@ansible ~]# ansible all -m yum -a "name=httpd state=removed"
#在Ansible中,all是一个用于指代所有主机的特殊关键字。当你在使用Ansible命令时,使用all会将命令应用到所有已定义的主机上。卸载httpd相关服务。被管理节点:
[root@localhost ~]# yum list | grep httpd | grep @
httpd-tools.x86_64                       2.4.6-99.el7.centos.1         @updates 
#检查是否还有安装httpd相关包。管理节点:
[root@ansible ~]# ansible all -m yum -a "name=httpd-tools state=removed"
#卸载httpd工具包,避免影响安装httpd。管理节点:
[root@ansible ~]# yum install -y httpd
#Ansible服务器安装网站服务
[root@ansible ~]# mkdir apache
[root@ansible ~]# cd apache/
[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .

② 编写剧本

[root@ansible apache]# vim apache.yaml
- hosts: webserver                     #针对的剧本对象tasks:                               #任务- name: install apache packages      #任务1:安装apache包(可以自定义)yum: name=httpd state=present      #调用yum安装模块:httpd,present,表示确保软件包已经安装- name: copy apache conf             #任务2:拷贝apache配置文件copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf #调用拷贝模块,源——>目标- name: ensure apache is running     #确保apache服务已运行service: name=httpd state=started enabled=yes   #调用系统服务状态模块

 ③ 检查测试

[root@ansible apache]# ansible-playbook apache.yaml --syntax-check  #检验语法playbook: apache.yaml
[root@ansible apache]# ansible-playbook apache.yaml --list-tasks    #列出任务playbook: apache.yamlplay #1 (webserver): webserver	TAGS: []tasks:install apache packages	TAGS: []copy apache conf	TAGS: []ensure apache is running	TAGS: []
[root@ansible apache]# ansible-playbook apache.yaml --list-hosts    #列出主机playbook: apache.yamlplay #1 (webserver): webserver	TAGS: []pattern: [u'webserver']hosts (4):host4host3host2host1

 ④ 执行剧本

[root@ansible apache]# ansible-playbook apache.yamlPLAY [webserver] ************************************************************************************************TASK [Gathering Facts] ******************************************************************************************
ok: [host2]
ok: [host3]
ok: [host1]
ok: [host4]TASK [install apache packages] **********************************************************************************
changed: [host2]
changed: [host1]
changed: [host4]
changed: [host3]TASK [copy apache conf] *****************************************************************************************
ok: [host2]
ok: [host3]
ok: [host1]
ok: [host4]TASK [ensure apache is running] *********************************************************************************
changed: [host2]
changed: [host1]
changed: [host4]
changed: [host3]PLAY RECAP ******************************************************************************************************
host1                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host2                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host3                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host4                      : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

7. Handlers 组件

在 Playbook 中,Handlers 通常会在任务中触发,并在整个 Playbook 运行结束时才会执行。

示例:修改管理节点apace配置文件模板,拷贝到被管理节点,查看apache相关信息:

① 修改管理几点服务器apache监听端口号,执行剧本查看被代理节点服务器配置是否拷贝

[root@ansible ~]# yum install -y httpd
#Ansible服务器安装网站服务
[root@ansible ~]# mkdir apache
[root@ansible ~]# cd apache/
[root@ansible apache]# cp -rf /etc/httpd/conf/httpd.conf .
[root@ansible apache]# sed -i 's/Listen 80/Listen 8080/' httpd.conf

② 查看被代理节点apache配置文件已及更新,但是并没有生效

③ 由于剧本服务模块指令是启动,需要定义、引用处理程序

注意:如果将 state=started 改为 restart ,将会导致每次执行剧本都会重启 apache 服务。

[root@ansible apache]# vim apache.yaml
- hosts: webserver                       #定义了将要执行任务的目标主机或主机组tasks:- name: install apache packages        #对Playbook的描述,用于标识该Playbook的作用。yum: name=httpd state=present- name: copy apache confcopy: src=./httpd.conf dest=/etc/httpd/conf/httpd.confnotify: restart apache service       #通知,当copy模块产生改变,通知程序重启,需要与handlers的name一样 #应用处理程序- name: ensure apache is runningservice: name=httpd state=started enabled=yeshandlers:                              #当任务触发会执行 #定义处理程序- name: restart apache service         #任务,重启apache(名字自定义)service: name=httpd state=restarted

 ④ 再次修改管理节点 apachep 配置文件端口号,执行剧本,查看被代理节点 apache 端口信息

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

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

相关文章

Spring Boot 集成 WebSocket 实例 | 前端持续打印远程日志文件更新内容(模拟 tail 命令)

这个是我在 CSDN 的第一百篇原则博文&#xff0c;留念&#x1f60e; #1 需求说明 先说下项目结构&#xff0c;后端基于 Spring Boot 3&#xff0c;前端为 node.js 开发的控制台程序。现在希望能够在前端模拟 tail 命令&#xff0c;持续输出后端的日志文件。 #2 技术方案 #2.…

Python基础(七)之数值类型集合

Python基础&#xff08;七&#xff09;之数值类型集合 1、简介 集合&#xff0c;英文set。 集合&#xff08;set&#xff09;是由一个或多个元素组成&#xff0c;是一个无序且不可重复的序列。 集合&#xff08;set&#xff09;只存储不可变的数据类型&#xff0c;如Number、…

【mask】根据bbox提示同一张图片生成多个矩形框掩码

前提&#xff1a;使用labelimg得到bbox 1.代码 import cv2 import numpy as np# 读取图片 image cv2.imread("D:\Desktop\mult_test\images\SL03509990_1694761223500.jpg")# 假设我们有多个目标的ROI&#xff08;感兴趣区域&#xff09; rois [(565,635,1006,85…

MySQL实战:监控

监控指标 性能类指标 名称说明QPS数据库每秒处理的请求数量TPS数据库每秒处理的事务数量并发数数据库实例当前并行处理的会话数量连接数连接到数据库会话的数量缓存命中率Innodb的缓存命中率 功能类指标 名称说明可用性数据库是否正常对外提供服务阻塞当前是否有阻塞的会话…

zookeeper快速入门四:在java客户端中操作zookeeper

系列文章&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 先启动zookeeper服务端。 在maven引入zookeeper依赖。 <depende…

51单片机—DS18B20温度传感器

目录 一.元件介绍及原理 二&#xff0c;应用&#xff1a;DS18B20读取温度 一.元件介绍及原理 1.元件 2.内部介绍 本次元件使用的是单总线 以下为单总线的介绍 时序结构 操作流程 本次需要使用的是SKIP ROM 跳过&#xff0c; CONVERT T温度变化&#xff0c;READ SCRATCHPAD…

RabbitMQ命令行监控命令详解

在分布式系统中&#xff0c;消息队列中间件如RabbitMQ扮演着至关重要的角色。为了保证系统的稳定性和高可用性&#xff0c;对RabbitMQ进行有效监控是必不可少的。本文将详细介绍RabbitMQ提供的命令行工具rabbitmqctl&#xff0c;这些工具可以帮助我们监控和管理RabbitMQ服务器。…

【论文精读】DDPM:Denoising Diffusion Probabilistic Models 去噪扩散概率模型

文章目录 一、背景&#xff08;一&#xff09;生成模型&#xff08;二&#xff09;数学理论基础&#xff08;三&#xff09;扩散模型的三种生成范式 二、文章概览&#xff08;一&#xff09;核心思想&#xff08;二&#xff09;前向过程&#xff08;三&#xff09;后向过程&…

玩转C语言——数组初探

一、前言 通过前面的学习&#xff0c;我们已了解C语言的结构变量、分支结构和循环结构。今天&#xff0c;我们一起来认识C语言的另一知识点——数组。先赞后看&#xff0c;养成习惯。 二、数组概念 学习数组&#xff0c;我们要明白数组是什么。在我看来&#xff1a;数组是⼀组…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 如果不是买的https证书 切记不检查https Kubenetes 服务证书key 的获取 登录 k8s 服务器 查看地址 Kubernetes 服务证书 key cat /root/..kube/config 查看秘钥 对秘钥进行base64 位 加密 echo "秘钥内容&…

JavaWeb后端——分层解耦 IOC DI

分层/三层架构概述 三层架构&#xff1a;Controller、Service、Dao 解耦/IOC&DI概述 分层解耦 容器称为&#xff1a;IOC容器/Spring容器 IOC 容器中创建&#xff0c;管理的对象&#xff0c;称为&#xff1a;bean 对象 IOC&DI入门 实现 IOC&DI 需要的注解&#…

分布式搜索引擎(3)

1.数据聚合 **[聚合&#xff08;](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[&#xff09;](https://www.ela…

使用HttpRequest工具类调用第三方URL传入普通以及文件参数并转换MultipartFile成File

使用HttpRequest工具类调用第三方URL传入普通以及文件参数 一、依赖及配置二、代码1、模拟第三方服务2、调用服务3、效果实现 一、依赖及配置 <!--工具依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId&g…

Linux进程管理:(六)SMP负载均衡

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识 1.1 CPU管理位图 内核…

windows文档格式转换的实用工具

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

CSDN 编辑器设置图片缩放和居中

CSDN 编辑器设置图片缩放和居中 文章目录 CSDN 编辑器设置图片缩放和居中对齐方式比例缩放 对齐方式 Markdown 编辑器插入图片的代码格式为 ![图片描述](图片路径)CSDN 的 Markdown 编辑器中插入图片&#xff0c;默认都是左对齐&#xff0c;需要设置居中对齐的话&#xff0c;…

如何写好Stable Diffusion的prompt

Stable Diffusion是一种强大的文本到图像生成模型&#xff0c;其效果在很大程度上取决于输入的提示词&#xff08;Prompt&#xff09;。以下是一些关于如何编写有效的Stable Diffusion Prompt的秘诀&#xff1a; 明确描述&#xff1a;尽量清晰地描述你想要的图像内容。使用具体…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型&#xff0c;该模型专门用于使用新型3D生成预训练Transformer&#xff08;GPT&#xff09;处理光谱RS图像。 重建损失由两个部分组成&#xff1a;令牌到令牌和频谱到频谱 下游任务&#xff1a;

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…

FFmpeg-aac、h264封装flv及时间转换

文章目录 时间概念流程api核心代码 时间概念 dts: 解码时间戳, 表示压缩帧的解码时间 pts: 显示时间戳, 表示将压缩帧解码后得到的原始帧的显示时间 时间基: time_base &#xff0c; 通常以ms为单位 时间戳: timestamp , 多少个时间基 真实时间&#xff1a;time_base * timest…