Ansible03-Ansible Playbook剧本详解
目录
- 写在前面
- 5. Ansible Playbook 剧本
- 5.1 YAML语法
- 5.1.1 语法规定
- 5.1.2 示例
- 5.1.3 YAML数据类型
- 5.2 Playbook组件
- 5.3 Playbook 案例
- 5.3.1 Playbook语句
- 5.3.2 Playbook1 分发hosts文件
- 5.3.3 Playbook2 分发软件包,安装软件包,启动服务
- 5.3.3.1 任务拆解
- 5.3.3.2 步骤变模块
- 5.3.3.3 编写playbook
- 5.3.3.4 测试并运行playbook
- 5.3.4 Playbook3 nfs服务
- 5.3.4.1 任务拆解
- 5.3.4.2 步骤变模块
- 5.3.4.3 编写playbook
- 5.3.4.4 测试并运行
写在前面
这是Ansible系列第三篇,内容为Ansible Playbook的介绍、使用
序号连续上篇笔记 Ansible02-Ansible Modules模块详解
回顾一下Ansible架构:
5. Ansible Playbook 剧本
Playbook,剧本,即Ansible中的脚本。用于配置、部署、管理被控节点。
就如同这个名字,Ansible会一步步执行Playbook中的内容,并相应返回OK
,Changed
,False
,Skipped
等反馈。
Ad-hoc的执行方式在多Modules时,过于繁琐,而为Ad-hoc编写shell脚本,又有点本末倒置。
Playbook语法尊崇yaml语法格式,文件名以.yaml
或.yml
为后缀。
5.1 YAML语法
一种类似XML、JSON的标记性语言。强调以数据为中心,号称“一种人性化的数据格式语言”(我没觉得多人性化)
5.1.1 语法规定
- 严格区分大小写
- 使用缩进标识层级关系
- 缩进不可用tab,只使用空格。空格数量没有要求,但同一层级需要保持一致。
#
标识注释"
后需要有一个空格- 多段YAML配置放在一个文件,用
---
分割
YAML转JSON语法网站,可用于验证yaml语法是否正确
http://json2yaml.com/convert-yaml-to-json
5.1.2 示例
#xml
<zhangsan><age>30</age><address>tianjin</address><dianha>132xxxxxx</dianha><youxiang>xx@163.com</youxiang>
</zhangsan>
#yaml
yunwei:chengyuan: 10gangwei: weihu---
kaifa:chengyuan: 25gangwei: kaifa---
ceshi:chengyuan: 5gangwei: ceshi
5.1.3 YAML数据类型
- 纯量(布尔值、整数、浮点数、Null、时间、日期、字符串)
#布尔类型
c1: true(真),false(假)#整数
c2: 123#浮点型(小数)
c3: 123.1#null类型(使用~表示null)
c4: ~#日期类型,日期必须使用ISO 8601格式,即yyyy-MM-dd
c5: 2024-05-28#时间类型,时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
c6: 2024-05-28T08:34:20+08:00#字符串类型,简单写法直接写值即可,如果字符串中间有特殊字符,必须使用单引或双引括起来
c7: 'thi*!$hello'#字符串类型,字符串过多的情况可以使用引号拆成多行,每一行会被转化成一个空格
c8: "hello word xxxxxxxxxx"
- 对象(键值对)
#对象形式一(推荐)
zhangsan:age: 25address: beijing#对象形式二(了解)
zhangsan: {age: 25,address: beijing}
- 数组(列表)
#数组形式一(推荐)
lisi:age: 24address: - nanjing- beijing#数组形式二(了解)address: [nanjing,beijing]
5.2 Playbook组件
playbook是由一个或者多个play组成的列表,可以让这些列表按事先编排的机制执行
task是调用ansible的具体模块,在模块参数中可以使用变量。模块执行是幂等性的,意味着多次执行结果相同。
- hosts:执行的远程主机列表
- remote_user: 指定以远程主机哪个用户的身份执行命令
- tasks:任务集
- variables:内置变量或自定义变量在playbook中调用
- tempaltes 模板,可替换文件中的变量并实现一些简单逻辑的文件
- handles 处理程序和notify结合使用,由特定条件触发的操作,满足条件方执行,否则不执行
- tags标签,指定某条任务执行,用于选择运行playbook中的部分代码。
5.3 Playbook 案例
5.3.1 Playbook语句
#运行剧本,playbook以yml或yaml结尾皆可
ansible-playbook xxx.yaml/xxx.yml#--syntax-check 用于检测playbook语法是否正确,如果正确只返回playbook名称
ansible-playbook --syntax-check xxx.yaml/xxx.yml#--check 用于模拟执行playbook
ansible-playbook --check xxx.yaml/xxx.yml
5.3.2 Playbook1 分发hosts文件
# 编写playbook
[root@manager playbook]# cat 02.fenfa.yaml
- hosts: front,dockertasks:- name: 01.create the directory# file: path=/server/files state=directoryfile:path: /server/filesstate: directory- name: 02.send the filecopy:src: /etc/hostsdest: /server/files
- 解释:
## Playbook 文件:`02.fenfa.yaml`
这个Playbook 指定了两个任务,这些任务将在名为 `front` 和 `docker` 的主机上执行。### 主机(Hosts)
- `front,docker`:这些是目标主机的名称,Playbook 将会在这两个主机上执行定义的任务。### 任务列表(Tasks)
#### 任务 1: 创建目录 (`01.create the directory`)
- **名称**: `01.create the directory` — 此任务的描述性名称。
- **模块**: `file` — Ansible 的文件模块,用于文件和目录的管理。
- **参数**:- `path`: `/server/files` — 指定了要创建的目录的路径。- `state`: `directory` — 确保指定路径被创建为一个目录。#### 任务 2: 发送文件 (`02.send the file`)
- **名称**: `02.send the file` — 此任务的描述性名称。
- **模块**: `copy` — Ansible 的复制模块,用于将文件从本地复制到远程主机。
- **参数**:- `src`: `/etc/hosts` — 指定了要复制的源文件的路径,这里是本地的 `/etc/hosts` 文件。- `dest`: `/server/files` — 指定了复制文件到远程主机上的目标路径。### 特殊说明
- 注释掉的行(以 `#` 开头)表示该行被注释,不会执行。在这个例子中,`file` 模块的一行被注释了,这意味着实际执行时将使用未注释的 `file` 模块的配置。这个Playbook 的目的是在 `front` 和 `docker` 这两个主机上创建一个名为 `/server/files` 的目录,并将本地的 `/etc/hosts` 文件复制到该目录中。
# 执行语法检查,若成果只返回文件名
[root@manager playbook]# ansible-playbook --syntax-check 02.fenfa.yaml
playbook: 02.fenfa.yaml# 模拟运行,只会返回结果而不会真实运行
[root@manager playbook]# ansible-playbook --check 02.fenfa.yamlPLAY [front,docker] **************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]TASK [01.create the directory] ***************************************************************************************
ok: [192.168.100.148]
changed: [192.168.100.141]TASK [02.send the file] **********************************************************************************************
changed: [192.168.100.141]
changed: [192.168.100.148]PLAY RECAP ***********************************************************************************************************
192.168.100.141 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.100.148 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0#真正的playbook运行
[root@manager playbook]# ansible-playbook 02.fenfa.yamlPLAY [front,docker] **************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]TASK [01.create the directory] ***************************************************************************************
ok: [192.168.100.148]
changed: [192.168.100.141]TASK [02.send the file] **********************************************************************************************
changed: [192.168.100.148]
changed: [192.168.100.141]PLAY RECAP ***********************************************************************************************************
192.168.100.141 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.100.148 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0# 检查运行结果是否正确
[root@manager playbook]# ansible docker,front -m shell -a 'tree /server/files; cat /server/files/hosts'
192.168.100.141 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.151 manager
192.168.100.150 storage
192.168.100.149 backup
192.168.100.148 front
192.168.100.141 docker192.168.100.148 | CHANGED | rc=0 >>
/server/files
└── hosts0 directories, 1 file
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.151 manager
192.168.100.150 storage
192.168.100.149 backup
192.168.100.148 front
192.168.100.141 docker
5.3.3 Playbook2 分发软件包,安装软件包,启动服务
以zabbix-agent为例
5.3.3.1 任务拆解
- 下载
wget https://mirrors.aliyun.com/zabbix/zabbix/6.5/centos/8/x86_64/zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpm
- 安装
yum install -y zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpm
-
配置(略)
-
启动开机
5.3.3.2 步骤变模块
wget -> get_url
yum -> yum
配置 -> debug模拟
systemctl -> systemd
5.3.3.3 编写playbook
- hosts: front,dockertasks:- name: 01.download the zabbix-agentget_url:url: https://mirrors.aliyun.com/zabbix/zabbix/6.5/centos/8/x86_64/zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpmdest: /tmp/validate_certs: no #关闭校验- name: 02.yum install zayum:name: /tmp/zabbix-agent-7.0.0-alpha3.release1.el8.x86_64.rpmstate: presentdisable_gpg_check: yes #关闭gpgcheck- name: 03.配置debug:msg: "模拟配置zabbix-agent"- name: 04.startupsystemd:name: zabbix-agentenabled: yesstate: started
5.3.3.4 测试并运行playbook
#测试语法合格
[root@manager playbook]# ansible-playbook --syntax-check 03.install-zabbix-agent.yamlplaybook: 03.install-zabbix-agent.yaml#模拟测试运行
[root@manager playbook]# ansible-playbook --check 03.install-zabbix-agent.yaml#运行
[root@manager playbook]# ansible-playbook 03.install-zabbix-agent.yamlPLAY [front,docker] **************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]TASK [01.download the zabbix-agent] **********************************************************************************
ok: [192.168.100.148]
ok: [192.168.100.141]TASK [02.yum install za] *********************************************************************************************
changed: [192.168.100.141]
changed: [192.168.100.148]TASK [03.配置] *******************************************************************************************************
ok: [192.168.100.148] => {"msg": "模拟配置zabbix-agent"
}
ok: [192.168.100.141] => {"msg": "模拟配置zabbix-agent"
}TASK [04.startup] ****************************************************************************************************
changed: [192.168.100.148]
changed: [192.168.100.141]PLAY RECAP ***********************************************************************************************************
192.168.100.141 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.100.148 : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
5.3.4 Playbook3 nfs服务
5.3.4.1 任务拆解
- 服务端backup:
- 部署nfs-utils,rpcbind
- 修改配置文件
- 创建共享目录并修改所有者
- 启动服务rpcbind、nfs
- 客户端front:
- 安装nfs-utils
- 配置挂载
5.3.4.2 步骤变模块
- 服务端:
- 部署 -> yum
- 配置文件 -> lineinfile
- 创建共享目录 -> file
- 启动服务 -> systemd
- 客户端:
- 安装 -> yum
- 挂载 -> mount
5.3.4.3 编写playbook
- hosts: backuptasks:- name: 1. 部署nfs-utils,rpcbindyum:name: nfs-utils,rpcbindstate: present- name: 2. 修改配置文件lineinfile:path: /etc/exportsline: "/backup-nfs *(rw,all_squash)"create: true- name: 3. 创建共享目录并修改所有者file:path: /backup-nfsstate: directoryowner: nobodygroup: nobody- name: 4. 启动服务rpcbindsystemd:name: rpcbindenabled: yesstate: started- name: 5. 启动服务nfssystemd:name: nfs-serverenabled: yesstate: started- hosts: fronttasks:- name: 1. 安装nfs-utilsyum:name: nfs-utilsstate: present- name: 2. 配置挂载mount:src: 192.168.100.149:/backup-nfspath: /ans-upload#挂载点不存在会自动创建fstype: nfsstate: mounted
5.3.4.4 测试并运行
# 语法测试
[root@manager playbook]# ansible-playbook --syntax-check 04.deploy_nfs.yamlplaybook: 04.deploy_nfs.yaml#运行
[root@manager playbook]# ansible-playbook 04.deploy_nfs.yamlPLAY [backup] ********************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.149]TASK [1. 部署nfs-utils,rpcbind] *************************************************************************************
ok: [192.168.100.149]TASK [2. 修改配置文件] ***********************************************************************************************
ok: [192.168.100.149]TASK [3. 创建共享目录并修改所有者] ***********************************************************************************
ok: [192.168.100.149]TASK [4. 启动服务rpcbind] ********************************************************************************************
ok: [192.168.100.149]TASK [5. 启动服务nfs] ************************************************************************************************
ok: [192.168.100.149]PLAY [front] *********************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.100.148]TASK [1. 安装nfs-utils] **********************************************************************************************
ok: [192.168.100.148]TASK [2. 配置挂载] ***************************************************************************************************
changed: [192.168.100.148]PLAY RECAP ***********************************************************************************************************
192.168.100.148 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.100.149 : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
相关文章:

Ansible03-Ansible Playbook剧本详解
目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包,安装软件包,启动服务5.3.3.1 任务拆解…...

Qt-qrencode生成二维码
Qt-qrencode开发-生成二维码📀 文章目录 Qt-qrencode开发-生成二维码📀[toc]1、概述📸2、实现效果💽3、编译qrencode🔍4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…...
长安链使用Golang编写智能合约教程(三)
本篇主要介绍长安链Go SDK写智能合约的一些常见方法的使用方法或介绍 资料来源: 官方文档官方示例合约库 官方SDK接口文档 教程一:智能合约编写1 教程二:智能合约编写2 一、获取参数、获取状态、获取历史记录的方法解析 注意! …...

Vercel deploy- Nextjs project error-URL link-env variable
Vercel deploy- Nextjs project error-URL link-env variable Error Check Database URL Check next-auth URL NEXTAUTH_URLhttps://yourappname.vercel.app/ 依次排查可能性 Application error: a server-side exception has occurred (see the server logs for more in…...

Java | Leetcode Java题解之第123题买卖股票的最佳时机III
题目: 题解: class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…...

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
Redis实现延迟队列
最近用到一个延迟消息的功能,第一时间想到使用MQ或者MQ的插件,因为数据量不大,所以尝试使用Redis来实现了,毕竟Redis也天生支持类似MQ的队列消费,所以,在这里总结了一下Redis实现延迟消息队列的方式。 一、…...

如何准确查找论文数据库?
在学术研究过程中,查找相关论文是获取最新研究成果、支持自己研究的重要途径。准确查找论文数据库不仅可以节省时间,还能确保找到高质量的学术资源。本文将介绍一些有效的方法和策略,帮助您准确查找论文数据库。 1. 选择合适的数据库 不同的…...

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)
What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件(IStream 版本) 上一次,我们看…...

【FPGA】Verilog语言从零到精通
接触fpga一段时间,也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇:Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架:模块的结构 类比:c语言的基础…...

unity打包的WebGL部署到IIS问题
部署之后会出错,我遇到的有以下几种; 进度条卡住不动 明明已经部署到了IIS上,为什么浏览网页的时候还是过不去或者直接报错。 进度条卡住不动的问题其实就是wasm和data的错误。 此时在浏览器上按F12进入开发者模式查看错误(下图…...
GPT-4o:人工智能的新里程碑
GPT-4o,作为OpenAI最新推出的人工智能技术,无疑在人工智能领域掀起了新一轮的浪潮。这款新型的语言模型不仅继承了GPT系列的核心优势,更在多个方面实现了突破性的进展。以下,我们将从版本间的对比分析、GPT-4o的技术能力以及个人整…...

发现一个ai工具网站
网址 https://17yongai.com/ 大概看了下,这个网站收集的数据还挺有用的,有很多实用的ai教程。 懂ai工具的可以在这上面找找灵感。...

第二十五章新增H5基础(以及视频~兼容)
1.HTML5中新增布局标签 HTML5新增了页眉,页脚,内容块等文档结构相关标签,可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题,…...
[英语单词] production quality
Our goal is to implement a production quality switch platform that supports standard management interfaces and opens the forwarding functions to programmatic extension and control. 说在openswitch的文档里有说这两词,含义是产品质量。是production修…...
windows安装nodeJs,以及常用操作
1. 官网(Node.js — Run JavaScript Everywhere (nodejs.org))下载想要安装的node版本 的安装包完成安装 2.环境变量设置: 系统变量: Path新增:D:\Program Files\nodejs (node安装目录) 3.设置淘宝源: npm config set registr…...

MySql part1 安装和介绍
MySql part1 安装和介绍 数据 介绍 什么是数据库,数据很好理解,一般来说数据通常是我们所认识的 描述事物的符号记录, 可以是数字、 文字、图形、图像、声音、语言等,数据有多种形式,它们都以经过数字化后存入计算机…...

SpringBoot打war包并配置外部Tomcat运行
简介 由于其他原因,我们需要使用SpringBoot打成war包放在外部的Tomcat中运行,本文就以一个案例来说明从SpringBoot打war包到Tomcat配置并运行的全流程经过 环境 SpringBoot 2.6.15 Tomcat 8.5.100 JDK 1.8.0_281 Windows 正文 一、SpringBoot配置打war包 第一步&a…...
2024.5.31每日一题
LeetCode 找出缺失的重复数字 题目链接:2965. 找出缺失和重复的数字 - 力扣(LeetCode) 题目描述 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次ÿ…...
Oracle 数据库 varchar2 从 4000 扩展到 32k
Oracle 数据库 varchar2 从 4000 扩展到 32k 0. 引言1. 扩展 varchar2 支持长度2. 测试 0. 引言 今天来个项目需求,有1个字段的存储内容大概1万字。 当然其中1个方法是将这个字段的内容切分成几个字段,还有1个方法就是将 varchar2 默认支持 4000 的能力…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...