Ansible的脚本-----playbook剧本【上】
目录
1.playbook剧本组成
2.playbook剧本实战演练
2.1 实战演练一:给被管理主机安装httpd服务
2.2 实战演练二:定义、引用变量
2.3 实战演练三:指定远程主机sudo切换用户
2.4 实战演练四:when条件判断
2.5 实战演练五:迭代循环
3.总结
1.playbook剧本组成
(1)Tasks:任务,即通过task调用ansible的模板将多个操作组织在一个playbook中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色
2.playbook剧本实战演练
示例:
vim test1.yaml
--- #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play #定义一个play的名称,可省略gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号分隔remote_user: root #指定被管理主机上执行任务的用户tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection #自定义任务名称ping: #使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: '/sbin/setenforce 0' #command模块和shell模块无需使用key=value格式ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped #使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd #notify和handlers中任务的名称必须一致service: name=httpd state=restarted
##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
2.1 实战演练一:给被管理主机安装httpd服务
在ansible服务器主机,给远程被管理主机制作安装httpd服务的剧本文件play1.yam
mkdir playbook
cd playbook/
vim play1.yaml
- name: first playgather_facts: falsehosts: dbserversremote_user: roottasks:- name: disable firewalldservice: name=firewalld state=stopped enabled=no- name: disable selinuxcommand: 'setenforce 0'ignore_errors: true- name: mount cdrommount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted- name: install httpdyum: name=httpd state=latest- name: start httpdservice: name=httpd state=started enabled=yes

运行playbook
ansible-playbook play1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook play1.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook play1.yaml --list-task #检查tasks任务
ansible-playbook play1.yaml --list-hosts #检查生效的主机
ansible-playbook play1.yaml --start-at-task='install httpd' #指定从某个task开始运行


被控制端验证安装情况

添加触发器
scp /etc/httpd/conf/httpd.conf 192.168.9.114:/opt/ #将httpd服务端下的httpd.conf文件复制到ansible服务器

vim /opt/httpd.conf ansible服务器
修改42行端口为8080,以便测试
vim play1.yaml
- name: first playgather_facts: falsehosts: dbserversremote_user: roottasks:- name: disable firewalldservice: name=firewalld state=stopped enabled=no- name: disable selinuxcommand: 'setenforce 0'ignore_errors: true- name: mount cdrommount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted- name: install httpdyum: name=httpd state=latest- name: copy config filecopy: src=/opt/httpd.conf dest=/etc/httpd/conf/notify: "reload httpd"- name: start httpdservice: name=httpd state=started enabled=yeshandlers:- name: reload httpdservice: name=httpd state=reloadedansible-playbook play1.yaml --syntax-check
ansible-playbook play1.yaml


被控制端查看端口是否同步

2.2 实战演练二:定义、引用变量
vim play2.yaml
- name: second playremote_user: roothosts: dbserversvars:- myname: scj- myclass: xy101tasks:- name: create groupgroup: name={{myclass}}- name: create useruser: name={{myname}} groups={{myclass}}ansible-playbook play2.yaml --syntax-check
ansible-playbook play2.yaml


被控制主机验证

使用facts信息做变量
vim play2.yaml- name: second playremote_user: roothosts: dbserversgather_facts: truevars:- myname: scj- myclass: xy101tasks:- name: create groupgroup: name={{myclass}}- name: create useruser: name={{myname}} groups={{myclass}}- name: copy filecopy: content={{ansible_default_ipv4}} dest=/opt/ipv4.txtansible-playbook play2.yaml


被控制节点验证

指定子字段名称查看具体内容,获取子字段内容,使用.13.51解释
vim play2.yaml
- name: second playremote_user: roothosts: dbserversgather_facts: truevars:- myname: scj- myclass: xy101tasks:- name: create groupgroup: name={{myclass}}- name: create useruser: name={{myname}} groups={{myclass}}- name: copy filecopy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txtansible-playbook play2.yaml


被控制节点验证

运行时指定变量
ansible-playbook play2.yaml -e 'myname=zhuxiang' #在命令行里定义变量


2.3 实战演练三:指定远程主机sudo切换用户
vim /etc/sudoers #被控制节点为用户授权并设置密码
zhuxiang ALL=(ALL) ALLecho 123456 | passwd --stdin zhuxiang


vim play2.yaml
- name: second playremote_user: zhuxiangbecome: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行become_user: root #指定sudo用户为roothosts: dbserversgather_facts: truevars:- myname: wangwang- myclass: xy102tasks:- name: create groupgroup: name={{myclass}}- name: create useruser: name={{myname}} groups={{myclass}}- name: copy filecopy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txtansible-playbook play2.yaml -k -K
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码


被控制节点验证

2.4 实战演练四:when条件判断
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
vim play3.yaml
- name: third playremote_user: roothosts: webserversgather_facts: truetasks:- name: copy scj.sh to 9.111copy: src=/opt/scj.sh dest=/optwhen: ansible_default_ipv4.address == "192.168.9.111"- name: run sjc.sh on 9.113script: '/opt/scj.sh scj tangjun'when: inventory_hostname != "192.168.9.111"

192.168.9.111节点

192.168.9.113节点

2.5 实战演练五:迭代循环
vim play4.yaml
- name: four playremote_user: roothosts: dbserversgather_facts: notasks:- debug: msg="{{item}}"with_items:- a- b- cansible-playbook play4.yaml


迭代创建用户
vim play4.yaml- name: four playremote_user: roothosts: dbserversgather_facts: notasks:- name: create usersuser: name={{item}} groups=xy101with_items:- zhang- san- liansible-playbook play4.yaml


被控制节点验证
vim /etc/group
vim /etc/passwd
#可根据两条命令查看是否创建成功
创建多个用户并加入不同组
vim play4.yaml
- name: four playremote_user: roothosts: dbserversgather_facts: novars:- mygroups: ["xy1", "xy2", "xy3"]tasks:- name: create groupsgroup: name={{item}}with_items: "{{mygroups}}"- name: create usersuser: name={{item.myname}} groups={{item.myclass}}with_items:- myname: simyclass: xy1- myname: wangmyclass: xy2- myname: wumyclass: xy3
ansible-playbook play4.yaml


被控制节点验证
vim /etc/group
vim /etc/passwd
#可根据两条命令查看是否创建成功
3.总结
playbook剧本的格式
vim XXX.yaml XXX.yml
- name: #设置play的名称(一个playbook文件里可以有多个play)hosts: #设置执行此play的远程主机组,多个组用 : 分隔remote_user: #设置在远程主机执行此play的用户名,默认为rootbecome: yes #设置是否需要在远程主机sudo切换执行任务become_user: root #设置sudo切换的用户,一般为rootgather_facts: true|false #设置是否收集facts信息,默认为truevars: #设置此play中使用的自定义变量- 变量1: 值1- 变量2: 值2tasks: #设置此play的任务列表- name: #定义任务的名称模块名: 模块参数 #定义此任务要使用的模块和参数(键值对格式 key=value)- name: 模块名: 模块参数ignore_errors: true #忽略此任务可能的失败(如果不忽略,则任务失败会导致中断后续任务的执行)- name: 模块名: 模块参数when: 条件表达式 #条件表达式成立则执行此任务,不成立则不执行此任务- name: 模块名: 模块参数={{item}} #循环遍历with_items: #定义循环的取值列表- name: 模块名: 模块参数notify: '任务名' #定义此任务执行状态为changed时要触发的handler任务handlers: #设置notify触发的任务- name: 任务名模块名: 模块参数playbook运行命令
ansible-playbook XXX.yaml -u <远程用户> -k--become-user <sudo切换的用户> -K--syntax-check--list-task--list-hosts--start-at-task="任务名"-e "变量=值"模块参数的格式
横向格式:模块名: 参数1=值 参数2={{变量名}} ....纵向格式:模块名: 参数1: 值参数2: "{{变量名}}"....vars 和 with_items 的格式
#值为纯量类型时:
tasks:
- name:模块名: 参数1={{item}}with_items:- 值1 #纵向格式:- 值2....tasks:
- name:模块名: 参数1={{item}}with_items: ["值1", "值2", ....] #横向格式#先使用vars定义循环取值列表,再用with_items引用vars的变量
vars:
- 变量1:- 值1 #纵向格式- 值2....
- 变量2: ["值1", "值2", ....] #横向格式tasks:
- name:模块名: 参数1={{item}}with_items: "{{变量1}}" #使用with_items引用vars的变量
- name:模块名: 参数1={{item}}with_items: "{{变量2}}"#当值为对象类型(键值对)时:
tasks:
- name:模块名: 参数1={{item.key1}} 参数2={{item.key2}}with_items: - key1: 值1 #纵向格式key2: 值2- key1: 值3key2: 值4....with_items:- {key1: 值1, key2: 值2} #横向格式- {key1: 值3, key2: 值4}....vars:
- 变量1: - key1: 值1 #纵向格式key2: 值2- key1: 值3key2: 值4....
- 变量2:- {key1: 值1, key2: 值2} #横向格式- {key1: 值3, key2: 值4}....
tasks:
- name:模块名: 参数1={{item.key1}} 参数2={{item.key2}}with_items: "{{变量1}}"
相关文章:
Ansible的脚本-----playbook剧本【上】
目录 1.playbook剧本组成 2.playbook剧本实战演练 2.1 实战演练一:给被管理主机安装httpd服务 2.2 实战演练二:定义、引用变量 2.3 实战演练三:指定远程主机sudo切换用户 2.4 实战演练四:when条件判断 2.5 实战演练五&…...
sql注入学习与防护
一、SQL注入分类 SQL注入根据攻击方式的不同,可以分为以下几种类型: 数字型注入字符型注入报错注入布尔盲注时间盲注联合查询注入基于堆叠的查询注入 二、SQL注入流程 发现注入点猜测字段数确定显示字段获取数据库信息获取数据库中的表获取表中的字段获…...
饥荒dst联机服务器搭建基于Ubuntu
目录 一、服务器配置选择 二、项目 1、下载到服务器 2、解压 3、环境 4、启动面板 一、服务器配置选择 首先服务器配置需要2核心4G,4G内存森林加洞穴大概就占75% 之后进行服务器端口的开放: tcp:8082 tcp:8080 UDP:10888 UDP:10998 UDP:10999 共…...
AtCoder Beginner Contest 363
A - Piling Up 题意 不同的分数段有不同的^数量,Takahashi想要使得他的^数量增加,问他所需要的最少分数增幅。 思路 我们只需要找到下一阶段的下限。 a / 100 是本阶段 1 变成下一阶段,再 * 100变成下限,再与原来的相减即可…...
Protel DXP 面试题详解及参考答案(4万字长文)
解释Protel DXP的基本工作流程。 Protel DXP(现已更名为Altium Designer)是一款用于电子设计自动化(EDA)的软件,主要应用于印刷电路板(PCB)设计。其基本工作流程通常包括以下几个阶段: 项目创建与配置: 开始一个新的设计项目时,首先需要创建一个项目文件,在这个文件…...
雪花算法 集群uid重复问题 uid-generator-spring-boot-starter
1、在生成环境 在某个业务使用该插件生成uid,由于业务整合了 mybatis-plus模块 2、该业务是分部署集群部署以及使用的多线程获取uid,使用中发现唯一建冲突,生成的uid有重复。 然后查看日志发现 workerId 始终为0 怀疑是生成workerId出了问题。 查看跟…...
【AutoDL】AutoDL+Xftp+Xshell+VSCode配合使用教程
身边没有显卡资源或不足以训练模型时,可以租赁服务器的显卡。 1、AutoDL Step :注册账号->选择显卡->选择环境->开机启动 1.1 首先打开AutoDL官网,注册账号 1.2 租赁自己想要的显卡资源 1.3 选择基础环境。 此处,我们让其自动配置…...
使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作
minio client 前言使用1.拉取minio client 镜像2.部署mc容器3.添加云存储服务器4.迁移数据1.全量迁移2.只迁移某个桶3.覆盖重名文件 5.其他操作1.列出所有alias、列出列出桶中的文件和目录1.1.列出所有alias1.2.列出桶中的文件和目录 2.创建桶、删除桶2.1.创建桶2.2.删除桶 3.删…...
Vue3分段控制器(Segmented)
效果如下图:在线预览 APIs Segmented 参数说明类型默认值必传block是否将宽度调整为父元素宽度,同时所有选项占据相同的宽度booleanfalsefalsedisabled是否禁用booleanfalsefalseoptions选项数据string[] | number[] | SegmentedOption[][]falsesize控…...
SpringSecurity如何正确的设置白名单
在SpringSecurity中,往往需要对部分接口白名单访问,而大部分在使用Security中就有一个误区,那就是免鉴权访问和白名单的区别。 大部分的Security文章包括官方文档给出免鉴权访问都是使用.permitAll()去对相应路径进行免鉴权访问,但实际上这仅仅只表示该资源不需要相应的权限访问…...
【Langchain大语言模型开发教程】评估
🔗 LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、Example generation 2、Manual evaluation and debug 3、LLM-assisted evaluation 4、LangChain evaluation platform 1、引包、加载环境变量; import osfrom dotenv imp…...
Python爬虫小项目实战
1.自动获取小说多个章节内容 2.获取英雄联盟里面的全部英雄 3. 简单地自动抽奖系统 4. 简单地点赞系统 5. 制作查询手机号工具 6. 制做登录系统 7. 操作excel办公自动化 8. 自动批量保存图片 9. 获取NBA数据 10. 获取彩票信息 11. 获取房地产信息 12. 获取小说…...
PHP Filesystem 简介
PHP Filesystem 简介 PHP 是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发。在 PHP 中,Filesystem 是一个功能丰富的库,提供了一系列用于文件系统操作的函数。这些函数允许开发者读取、写入、修改和删除文件和目录,以及执行其他与文件系统相关的任务。 PHP Fil…...
源代码加密软件哪家好?五款企业级加密软件推荐
随着软件开发行业的快速发展,源代码作为核心资产,面临着越来越大的安全威胁。保护源代码不被泄露或盗用,是每个开发团队和企业都需要高度重视的问题。源代码加密软件通过对代码进行加密处理,确保其在传输和存储过程中保持机密性。…...
Redis常见的数据类型及操作方式
一、通用命令 1)获取redis中所有key keys * 2)删除一个或多个key del key1 key2 ... 3)判断key是否存在 exists key 4)给key添加过期时间 expire key time 5)查看key剩余过期时间 ttl key 6) 查看redis内存…...
谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集
文章目录 一,拖拽后结点的parentCid的更新二,拖拽后结点的父节点下所有结点的sort排序属性的变化更新排序的逻辑代码分析 三,拖拽后结点及其子节点catLevel的变化判断是否需要更新 catLevel获取拖动后的新节点 更新 catLevel完整代码 这一节的…...
AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画
在 Midjourney 中,seed 是指一个种子,用于生成图像时的起点或基础。 使用格式:--seed 获取的seed值 获取 seed 值 使用 seed 生成图像 a cute boys avatar, background with blue sky and white cloud, Ghibli Studio style, Hayao Miyazaki…...
笔记:Enum中FlagsAttribute特性的用法
一、目的:分享Enum中FlagsAttribute特性的用法 在C#中,Enum(枚举)类型可以使用[Flags]属性来表示一个枚举可以存储多个值。这是通过按位运算符(如|(或)和&(与)&#…...
QWidget如何切换ui
在Qt中,QWidget及其子类用于构建图形用户界面。如果你想要在不同的UI之间切换,可以使用QStackedWidget,它可以管理一组QWidget,并且每次只显示其中一个。 以下是一个简单的例子,展示如何使用QStackedWidget切换UI&…...
web网站组成
web网站由四部分组成:浏览器 前端服务器 后端服务器 数据库服务器 流程: 1.浏览器输入网站后,向前端服务器发送请求,前端服务器响应,静态的数据给浏览器。 2.前端代码中script中有url,这个是向后台发送请求的网…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
