当前位置: 首页 > news >正文

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 端口信息

相关文章:

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

前言 上篇介绍了 Ansible 单模块&#xff08;AD-Hoc&#xff09;的相关内容Ansible自动化运维Inventory与Ad-Hoc-CSDN博客&#xff0c;Ad-Hoc 命令是一次性的、即时执行的命令&#xff0c;用于在远程主机上执行特定任务&#xff0c;这些命令通常用于快速执行简单的任务。当需要…...

WPF监控平台(科技大屏)[一]

跟着B站的视频敲了一个略微复杂的WPF界面,链接如下.在这里我详细的写一份博客进行设计总结. 系统介绍和配置及主窗口设计_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wy421Y7QD?p1&vd_source4796b18a2e4c1ec8a310391a5644b6da 成果展示 实现过程 总体来说,我的…...

HTML详细教程

文章目录 前言一、快速开发网站最简模板二、HTML标签1.编码2.title3.标题4.div和span5.超链接6.图片7.列表8.表格9.input系列10.下拉框11.多行文本 三、GET方式和POST方式1.GET请求2.POST请求 前言 HTML的全称为超文本标记语言&#xff0c;是一种标记语言&#xff0c;是网站开发…...

【excel】常用的50个函数与基础操作(统计函数)

统计函数 &#xff08;1&#xff09;数组函数操作 1.【SUM】求和 SUM&#xff08;数字1&#xff0c;数字2&#xff0c;数字3…&#xff09; 2.【SUMIF】单条件求和 SUMIF &#xff08;条件区域&#xff0c;条件&#xff0c;求和区域&#xff09; 3.【SUMIFS】(单)多条件求和…...

MATLAB中的cell数组和结构体

MATLAB中的Cell数组和结构体 MATLAB作为一种高级编程语言和数值计算环境&#xff0c;为用户提供了多种数据结构&#xff0c;以便更灵活、高效地处理数据。其中&#xff0c;cell数组和结构体是两种非常重要的数据结构&#xff0c;它们在MATLAB编程和数据管理中发挥着关键作用。…...

Python深度学习之路:TensorFlow与PyTorch对比【第140篇—Python实现】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python深度学习之路&#xff1a;TensorFlow与PyTorch对比 在深度学习领域&#xff0c;Tens…...

Unity中UGUI中的PSD导入工具的原理和作用

先说一下PSD导入工具的作用&#xff0c;比如在和美术同事合作开发一个背包UI业务系统时&#xff0c;美术做好效果图后&#xff0c;程序在UGUI中制作好界面&#xff0c;美术说这个图差了2像素&#xff0c;那个图位置不对差了1像素&#xff0c;另外一个图大小不对等等一系列零碎的…...

删除 Oracle 软件和数据库教程

1.使用 deinstall 工具删除安装的 Oracle 软件的可执行文件和配置文件 [oracleocpstudy admin]$ cd $ORACLE_HOME [oracleocpstudy db_1]$ cd deinstall [oracleocpstudy deinstall]$ ls bootstrap_files.lst bootstrap.pl deinstall deinstall.pl deinstall.xml jlib …...

C语言自学笔记8----C语言Switch语句

C 语言 switch 语句 switch语句使我们可以执行许多代替方案中的一个代码块。 虽然您可以使用if…else…if阶梯执行相同的操作。但是&#xff0c;switch语句的语法更容易读写。 switch … case的语法 switch (expression) { case constant1: // 语句 break; case constant2: // …...

分布式搜索引擎(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…...

PostgreSQL开发与实战(6.3)体系结构3

作者&#xff1a;太阳 四、物理结构 4.1 软件安装目录 bin //二进制可执行文件 include //头文件目录 lib //动态库文件 share //文档以及配置模版文件4.2 数据目录 4.2.1 参数文件 pg_hba.conf //认证配置文件 p…...

ISIS接口MD5 算法认证实验简述

默认情况下&#xff0c;ISIS接口认证通过在ISIS协议数据单元&#xff08;PDU&#xff09;中添加认证字段&#xff0c;例如&#xff1a;MD5 算法&#xff0c;用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中&#xff0c;并确保邻居之间的通信是可信的。它可…...

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…...

ABB新款ACS880-04-650A-3逆变器模块ACS88004650A3加急发货

全球商业别名&#xff1a;ACS880-04-650A-3 产品编号&#xff1a;3AUA0000137885 ABB型号名称&#xff1a;ACS880-04-650A-3 目录描述&#xff1a;低压交流工业单传动模块&#xff0c;IEC&#xff1a;Pn 355 kW&#xff0c;650 A&#xff0c;400 V&#xff0c;UL&#xff1a;Pl…...

Science Robotics 封面论文:美国宇航局喷气推进实验室开发了自主蛇形机器人,用于冰雪世界探索

人们对探索冰冷的卫星&#xff08;如土卫二&#xff09;的兴趣越来越大&#xff0c;这可能具有天体生物学意义。然而&#xff0c;由于地表或冰口内的环境极端&#xff0c;获取样本具有挑战性。美国宇航局的喷气推进实验室正在开发一种名为Exobiology Extant Life Surveyor&…...

flutter环境搭建实践

Dart Dart 是一种客户端和服务器端的编程语言&#xff0c;最早由 Google 提出。它被设计用于构建高性能、高度可伸缩和可靠的应用程序。Dart 可以编译成本地代码或者在虚拟机中直接运行。在移动应用开发中&#xff0c;Dart 主要用于开发 Flutter 应用。 Flutter 和 Dart 的关…...

CentOS无法解析部分网站(域名)

我正在安装helm软件&#xff0c;参考官方文档&#xff0c;要求下载 get-helm-3 这个文件。 但是我执行该条命令后&#xff0c;报错 连接被拒绝&#xff1a; curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # curl: (7) Fai…...

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

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

24计算机考研调剂 | 武汉科技大学

武汉科技大学冶金新技术与功能金属材料研究梯队招收研究生 考研调剂招生信息 学校:武汉科技大学 专业: 工学->治金工程 工学->材料科学与工程 工学->计算机科学与技术 工学->动力工程及工程热物理 工学->机械工程 年级:2024 招生人数:20 招生状态:正在招…...

个人网站制作 Part 11 添加用户权限管理 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加用户权限管理&#x1f528;使用Passport.js&#x1f527;步骤 1: 修改Passport本地策略 &#x1f528;修改用户模型&#x1f527;步骤 2: 修改用户模型 &#x1f528…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...