编写和运行 Playbook

Playbook 介绍

adhoc 命令可以作为一次性命令对一组主机运行一项简单的任务。不过,若要真正发挥Ansible的能力,需要使用功能 playbook。

playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。play是针对清单中选定的主机运行的一组有序任务。play可以让您将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测性。

在 playbook 中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。

ad hoc 命令示例:

[root@controller ~ 15:54:05]# ansible -m user -a "name=new

Playbooks以yaml格式编写,通常以 yaml 和 yml 扩展名保存。

改写成playbook:

---
- name: Configure important user consistentlyhosts: node1tasks:- name: newbie exists with UID 4000user:name: newbieuid: 4000state: present
...
  1. - name: Configure important user consistently
    • 这是一个 Play 的起始行,-表示这是列表中的一个项
    • name参数用于给这个 Play 定义一个描述性名称,说明该 Play 的功能是 “持续标准化配置重要用户”
  2. hosts: node1
    • hosts参数指定该 Play 要在哪些目标主机上执行
    • 这里设置为node1,表示只在名为node1的主机上运行后续任务
    • 缩进表示这是上一行 Play 的属性
  3. tasks:
    • tasks关键字标志着任务列表的开始
    • 后续缩进的内容都是要在目标主机上执行的具体任务
    • 缩进表示这是上一行 Play 的属性
  4. - name: newbie exists with UID 4000
    • -表示这是任务列表中的一个任务
    • name参数给这个具体任务定义名称,说明任务是 “确保 newbie 用户存在且 UID 为 4000”
    • 比上一行多一级缩进,表示这是tasks列表中的项
  5. user:
    • 指定该任务要使用的 Ansible 模块为user模块(用于管理系统用户)
    • 缩进表示这是上一行任务的属性
  6. name: newbie
    • nameuser模块的参数,指定要操作的用户名为newbie
    • 缩进表示这是user模块的参数
  7. uid: 4000
    • uiduser模块的参数,指定该用户的 UID(用户 ID)为 4000
    • 缩进表示这是user模块的参数
  8. state: present
    • stateuser模块的参数,present表示确保该用户存在(如果不存在则创建)
    • 缩进表示这是user模块的参数
  9. ...
    • YAML 格式中,...表示文档结束符,是可选的结束标记

yaml格式只使用空格缩进,对于空格的数量没有强制要求。

基本规则:

  • 同一级别的元素,使用相同的缩进。
  • 对于子项目,使用比父项目更多的缩进。
  • 增加空白行,提高可读性。

Vim 编辑器设置

如果使用vim编辑器,设置vim环境便于编辑Playbooks。

在$HOME/.vimrc文件中添加以下内容:

set ai ts=2

效果:

  • “ai”,即 “autoindex”,表示自动缩进。
  • “ts”,即 “tabstop”,表示tab键使用2个空格代替。
  • autocmd FileType yam,代表文件类型是yaml时,自动执行“set ai ts=2”。

Playbook 编写

Playbook 示例

playbook.yaml 内容如下:

# yaml格式起始行,一般不省略
---# Playbook中第一个play
# play具有属性:name,hosts,become,tasks,缩进一致
# name属性,用于简要描述play
- name: Enable intranet services# hosts属性,用于定义要在哪个受管理节点执行hosts: node1# tasks属性,用于描述play中任务,属性是列表格式tasks:# 第一个任务# 任务具有属性:涵name和模块名等。# name属性,用于简要描述任务- name: latest version of httpd and firewalld installed# 指明模块名,也就是要执行的任务yum:# 执行要操作的rpm包名称name:# rpm包名称是-开头的列表格式,或者逗号分隔的列表格式- httpd- firewalld# 定义软件包的状态,lastet代表升级为最新版本state: latest# 第二个任务- name: test html page is installed# copy模块,用于将content属性值写入到目标文件copy:content: "Welcome Laoma WebSite!\n"dest: /var/www/html/index.html# 第三个任务- name: firewalld enabled and running# service模块,用于启用并启动firewalld服务service:name: firewalldenabled: truestate: started# 第四个任务- name: firewalld permits access to httpd service# firewalld,用于放行http服务firewalld:service: httppermanent: truestate: enabledimmediate: yes# 第五个任务- name: httpd enabled and running# service模块,用于启用并启动httpd服务service:name: httpdenabled: truestate: started# Playbook中第二个play,-开头表示列表
- name: Test intranet web serverhosts: localhostbecome: notasks:- name: connect to intranet web server# uri模块,用于测试网站是否可以访问uri:url: http://node1return_content: yesstatus_code: 200# yaml格式结束行,一般省略
...
YAML 注释

在 YAML中, 编号或井号符号(#)右侧的所有内容都是注释。如果注释的左侧有内容, 请在该编号符号的前面加一个空格。注释可用于提高可读性。

YAML 单行字符串

YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。

字符串也可以用双引号或单引号括起。

YAML 多行字符串
  • 可以使用竖线(I)字符表示,保留字符串中的换行字符。

  • 也可以使用大于号(>)字符表示换行字符。执行时换行符使用空格代替,并且行内的引导空白将被删除。

YAML 字典

可以把 YAML 字典想象成一个 “多层抽屉柜”:

  • 最外层是一个大柜子(整个 YAML 文档),柜子上贴着标签(键),比如 “person”“company”。
  • 打开柜子,里面可能有小抽屉(子字典),每个小抽屉也有自己的标签,比如 “person” 柜子里有 “name”“age” 抽屉。
  • 每个抽屉里装着具体的东西(值):“name” 抽屉里放着 “Alice”,“age” 抽屉里放着 “30”。
  • 要是某个抽屉标签后面跟着 “:” 再换行缩进,就像 “拉开抽屉看到里面还有小格子”,比如 “address” 抽屉里还有 “city”“street” 这些更小的格子。

一组键值对的集合,又称为映射(mapping)和哈希(hashes)。

以缩进块的形式编写键值对集合,如下方所示:user属性是字典格式,是多个键值对集合。

user:name: laoma uid: 1088state: absent

字典也可以使用以花括号括起的内联块格式编写,如下方所示:

user: {name: laoma, uid: 1088, state: absent}

YAML 字典的基本语法规则:

  • 键和值之间用冒号 : 分隔,冒号后必须有空格(key: value
  • 通常使用缩进来表示层级关系(推荐 2 个空格,不建议用制表符)
  • 字典可以嵌套,形成复杂的数据结构

基础示例

# 简单字典
person:name: Aliceage: 30is_student: false

等价于 Python 字典:

{"person": {"name": "Alice","age": 30,"is_student": False}
}

行内式字典

也可以在一行内定义字典,用花括号 {} 包裹,键值对之间用逗号 , 分隔:

person: { name: Bob, age: 25, is_student: true }

嵌套字典

字典的值可以是另一个字典,形成多层结构:

company:name: Tech Corpaddress:city: Beijingstreet: Main Road 123zipcode: 100000departments:- name: HRcount: 5- name: ITcount: 20

(注:- 表示列表项,字典可以和列表结合使用)

在 Ansible 中的应用

你之前看到的 Ansible Playbook 就是典型的 YAML 字典结构:

- name: Configure user  # 列表项(Play)hosts: node1         # Play 的键值对tasks:               # Play 的键值对,值是一个列表- name: Create user  # 任务列表项user:              # 任务的键,值是一个字典name: newbie     # user 模块的参数(键值对)uid: 4000

这里的 hosts: node1user: {name: newbie, uid: 4000} 都是字典键值对的体现。

YAML 字典的核心是 “键值对应”,通过缩进和冒号来清晰表达数据之间的关系,这也是它在配置文件(如 Ansible、Docker Compose 等)中被广泛使用的原因

YAML 列表

一组按次序排列的值,又称为序列(sequence)和数组(array)。

以缩进块的形式编写的键值对集合,如下方所示:

- name: latest version of httpd and firewalld installedyum:name:- httpd- firewalldstate: latest
- name: test html page is installedcopy:content: "Welcome to the example.com intranet!\n"dest: /var/www/html/index.html

以上有两个任务,每个任务都是多个键值对描述。其中yum模块操作的软件包是一个简单的名称列表。

内联格式:

name: [httpd, firewalld]

尽量避免内联格式。

可以把 YAML 列表想象成 “一串带编号的收纳盒”,或者 “排队的队伍”—— 每个盒子 / 队伍里的人都是独立的,但都属于同一串 / 同一队,没有专属名字(不像字典的 “键”),只能靠 “位置” 来区分。

比如你去超市买水果,装了一袋苹果、一串葡萄、一个橙子,这袋水果就是一个列表:里面每样水果都是独立项,按顺序排着,要找葡萄就知道是 “袋子里的第二个”。

1. 基础样子:用 “-” 开头的 “队伍”

YAML 里用 - (减号 + 空格)表示列表里的一个项,所有项对齐缩进,就像队伍站成一列:

# 水果列表
fruits:- apple  # 第1项:苹果- grape  # 第2项:葡萄- orange # 第3项:橙子

就像在 “fruits” 这个袋子里,按顺序放了苹果、葡萄、橙子三个独立的水果,没有谁属于谁,只是 “凑在一起的一组东西”。

2. 列表里也能装 “抽屉柜”(嵌套字典)

列表的每个项不只能是简单的文字,还能装之前说的 “字典抽屉柜”。比如记录几个人的信息,每个人都是一个 “抽屉柜”,再把这些 “抽屉柜” 排成一队:

# 人员列表(每个项是一个字典)
people:- name: Alice  # 第1个人的抽屉柜age: 30- name: Bob    # 第2个人的抽屉柜age: 25- name: Charlie# 第3个人的抽屉柜age: 35

这就像 “people” 这个队伍里,站了三个带抽屉的人:第一个人(Alice)的抽屉里有 “name”“age”,第二个人(Bob)也有自己的抽屉,互不干扰,只按排队顺序区分。

3. 一行写完的 “紧凑队伍”

如果列表项少,也能像 “挤在一起排队” 一样写在一行,用方括号 [] 把所有项包起来,项之间用逗号隔开:

# 一行式列表
colors: [red, green, blue]  # 相当于:- red; - green; - blue

4. 在 Ansible 里的实际用法

你之前看的 Playbook 里,tasks 就是一个列表 —— 要执行的多个任务,按顺序排成一队:

tasks:- name: 确保newbie用户存在  # 第1个任务(列表项)user:name: newbie- name: 给newbie加sudo权限  # 第2个任务(列表项)copy:src: sudoers.d/newbiedest: /etc/sudoers.d/

这就像 “任务清单”,先做 “创建用户”,再做 “加 sudo 权限”,按列表顺序一个接一个执行,没有跳过的道理。

总结来说,YAML 列表的核心就是 “按顺序排的一组东西”,不管里面装的是简单文字,还是复杂的 “字典抽屉柜”,都靠 - 标识 “这是队伍里的一个”,靠顺序确定 “先谁后谁”。

Playbook 运行

[yy@controller ~ 16:16:47 web]$ ansible-playbook playbook.yaml

第一次执行剧本,任务状态全是黄色。

第二次执行剧本,任务状态全是绿色。

语法检查

选项–syntax-check,只检查剧本语法,不执行剧本。

ansible-playbook playbook.yaml --syntax-check
空运行

空运行,是指模拟运行,并不是真正执行。

ansible-playbook playbook.yaml -C
提高输出详细程度
  • -v,显示任务结果。一般情况使用 -v 即可。
  • -vv,任务结果和任务配置都会显示。
  • -vvv,包含关于与受管主机连接的信息。
  • -vvvv,增加了连接插件相关的额外详细程度选项,包括受管主机上用于执行脚本的用户,以及所执行的脚本。

Playbook 提权

在playbook中指定此关键字将覆盖/etc/ansible/ansible.cfg文件中的设置特权升级属性

  • remote_user,指定ssh用户

  • become,启用或禁用特权升级

  • become_method,启用特权升级的方法

  • become_user,特殊升级的帐户

---
- name: Enable intranet serviceshosts: node1remote_user: laomabecome: truebecome_method: sudobecome_user: roottasks:- name: latest version of httpd and firewalld installedyum:name:- httpd- firewalldstate: latest

在 Ansible 中,Playbook 提权主要是通过become关键字来实现的,它可以让任务以另一个用户(通常是root)的身份执行。以下是具体的提权方法:

  • 任务级提权:只在需要提权的任务上加上become: yes。例如:
- name: 需要root权限的任务copy:src: app.confdest: /etc/app.confbecome: yes
  • Play 级提权:在hosts同级加上become: yes,则这个 Play 里的所有任务都会默认提权。示例如下:
- name: 提权示例hosts: allbecome: yestasks:- name: 安装软件包apt:name: nginxstate: present
  • 命令行提权:运行 playbook 时加上-b--become参数,优先级最高,可以临时强制提权,适合调试或一次性任务。如ansible -playbook my_playbook.yml --become

此外,还有一些与提权相关的指令:

  • become_method:用于指定提权方法,默认是sudo。对于 Windows 系统是runas,网络设备(交换机、路由器等)是enable,容器则可使用machinectl。例如,当管理网络设备时,需设置become_method: enable
  • become_flags:可给提权命令添加额外参数。比如使用su命令提权时,若需要切换环境变量,可设置become_flags: '--login'
  • --ask - become - pass-K:运行 playbook 时,如果提权需要输入密码,可用这个参数让 Ansible 提示输入密码,以确保安全。

想象一下,Ansible Playbook 就像一个 “办事员”,平时只能做些普通权限的活儿(比如整理自己抽屉里的文件)。但有时候需要处理重要文件(比如修改系统配置、安装软件),这些活儿普通权限干不了,得有 “管理员” 身份才行。

“提权” 就像是给这个办事员开了张 “临时通行证”:

  • 任务级提权:就像特定事情才亮通行证 —— 比如 “只有给 /etc 目录拷贝文件时,才用管理员身份”
  • Play 级提权:相当于全天通行证 ——“今天所有活儿都用管理员身份干”
  • 命令行提权:好比临时加急授权 ——“这次特殊情况,强制用管理员身份处理”

而 become_method 就像通行证的类型:用 sudo 是 “找 sudo 管理员签字”,用 su 是 “直接切换成管理员本人”,给网络设备提权则是 “申请进入特权模式”。

简单说,提权就是让 Playbook 在需要时 “穿上管理员的马甲”,干完活儿再脱下来,既安全又高效

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

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

相关文章

uniapp手机端video标签层级过高问题

当我们想以视频作为背景时,其他dom通过定位显示在视频上方,h5页面上调试发现可以正常使用,效果如下: 当放在手机上看,会发现,仅仅剩一个视频,本应在视频上层的元素不见了。 经过一番排查&#x…

【MyBatis批量更新实现】按照list传入批量更新

学习目标&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 显示数据、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通过VOFA显示数据波形。 一、VOFA 下载 VOFA 是一款面向嵌入式开发的上位机软件&#xff0c;专注于硬件数据实时可视化与调试。它通过高效协议&#xff08;如FireWater、JustFloat&#xff09;将原始字节流转化为…

MySQL 插入数据提示字段超出范围?一招解决 DECIMAL 类型踩坑

MySQL 插入数据提示字段超出范围&#xff1f;一招解决 DECIMAL 类型踩坑 在日常数据库操作中&#xff0c;我们经常会遇到各种字段类型相关的问题。今天就来聊聊一个常见的错误&#xff1a;插入数据时提示字段值超出范围&#xff0c;以实际案例带你搞懂 MySQL 中 DECIMAL 类型的…

一周学会Matplotlib3 Python 数据可视化-绘制误差条形图

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

JVM垃圾回收器

垃圾回收算法标记-复制缺点&#xff1a;内存利用率低&#xff0c;有一块区域无法使用。标记-清除缺点&#xff1a;1. 效率问题 (如果需要标记的对象太多&#xff0c;效率不高)2. 空间问题&#xff08;标记清除后会产生大量不连续的碎片&#xff09;标记-整理分代收集根据对象存…

科研工具的一些注意事项

Origin Origin导入数据之后&#xff0c;可以考虑 [删除数据连接器…] 导入数据之后&#xff0c;删除数据连接&#xff0c;这样当原来的文件移动之后&#xff0c;就不影响origin文件里面的数据。不然就会出现空白数据&#xff1a;当然&#xff0c;没有数据了也可以加载出来&…

美国服务器环境下Windows容器工作负载智能弹性伸缩

在北美数据中心加速数字化转型的今天&#xff0c;企业客户日益重视Windows容器工作负载的智能化管理。本文将深入探讨基于Azure Stack HCI&#xff08;混合云基础设施&#xff09;的弹性伸缩方案如何突破传统资源调度瓶颈&#xff0c;通过分析指标收集、策略配置、混合云联动三…

欧姆龙CP系列以太网通讯实现上位机与触摸屏监控

一、行业痛点在现代工业生产中&#xff0c;自动化生产线的控制系统的高效性与智能化程度对生产效率和产品质量有着至关重要的影响。然而&#xff0c;许多传统工业生产线中使用的欧姆龙CP系列系列PLC以太网模块&#xff0c;由于自身设计原因&#xff0c;并未配备以太网接口&…

【大语言模型 00】导读

【大语言模型00】导读&#xff1a;你的LLM全栈工程师进阶之路关键词&#xff1a;大语言模型、LLM、Transformer、深度学习、AI工程化、全栈开发、技术路线图摘要&#xff1a;这是一份完整的大语言模型学习指南&#xff0c;涵盖从数学基础到商业落地的200篇深度文章。无论你是AI…

Business Magic

题目描述There are n stores located along a street, numbered from 1 to n from nearest to farthest. Last month, the storek had a net profit of rk . If rk is positive, it represents a profit of rk dollars; if rk is negative, it represents a loss of −rk dolla…

在ubuntu系统上离线安装jenkins的做法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 1.安装java环境和下载war包&#xff1a; Jenkins 依赖于 Java 环境&#xff08;OpenJDK 11 或更高版本&#xff09;&#xff1a; # 安装OpenJDK 11和字体依赖 sudo dpkg -i openjdk-11-jre-headless_*.deb fontconfi…

图像相似度算法汇总及Python实现

下面整理了一些图像相似度算法&#xff0c;可根据不同的需求选择不同的算法&#xff0c;对每种算法进行了简单描述并给出Python实现&#xff1a; 1. 基于像素的算法&#xff1a; (1).MSE(Mean Squared Error)&#xff1a;均方误差&#xff0c;通过计算两幅图像对应像素值差的平…

IO流与单例模式

单例模式 单例模式是指一个类只能有一个对象。 饿汉模式 在单例模式下&#xff0c;在程序开始&#xff08;main函数运行前&#xff09;的时候创建一个对象&#xff0c;这之后就不能再创建这个对象。 class HungryMan { public:static HungryMan* getinstance(){return &ins…

Java设计模式之依赖倒置原则使用举例说明

示例1&#xff1a;司机驾驶汽车 问题场景&#xff1a;司机类直接依赖奔驰车类&#xff0c;新增宝马车需修改司机类代码。 // 未遵循DIP class Benz { public void run() { /*...*/ } } class Driver { public void drive(Benz benz) { benz.run(); } } // 遵循DIP&#xff1a;…

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文档使用简记

一. ES parent-child 文档简介 ES 提供了类似数据库中 Join 联结的实现&#xff0c;可以通过 Join 类型的字段维护父子关系的数据&#xff0c;其父文档和子文档可以单独维护。 二. 父子文档的索引创建与数据插入 ES 父子文档的创建可以分为下面三步&#xff1a; 创建索引 M…

【Linux】编辑器vim的使用

目录 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移动光标 3.2 删除 3.3 复制 3.4 替换 3.5 撤销 3.6 更改 3.7 跳转 4. vim底行模式操作 4.1 列出行号 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 离开vim 1. vim的基本概念 Vim&…

《零基础掌握飞算Java AI:核心概念与案例解析》

前引&#xff1a;飞算科技是一家专注于企业级智能化技术服务的公司&#xff0c;核心领域包括AI、大数据、云计算等。其Java AI解决方案主要面向企业级应用开发&#xff0c;提供从数据处理到模型部署的全流程支持&#xff01;飞算Java AI是一款基于人工智能技术的Java开发辅助工…

Chrome腾讯翻译插件transmart的安装

文章目录一、官网地址二、安装过程1. 下载插件2. 解压crx3, chrome安装三、如何使用一、官网地址 腾讯翻译插件官网 二、安装过程 1. 下载插件 点击上面的官网地址&#xff0c;下拉到如图所示chrome插件位置&#xff0c;点击立即下载 2. 解压crx 从压缩文件中解压出crx文…