深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(下)
文章目录
- 六、playbook
- 运行playbook方式
- Playbook VS ShellScripts
- 忽略错误 ignore_errors
- handlers和notify结合使用触发条件
- playbook中tags的使用
- playbook中变量的使用
- invertory参数
- 模板templates
- 迭代与条件判断
- 迭代:with_items
- 迭代嵌套子变量
- roles
六、playbook
运行playbook方式
ansible-playbook <filename.yml> ... [options]
常见选项
--check (-C)只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--limit 主机列表 只针对主机列表中的主机执行
-i 指定主机清单(hosts)
-v 显示过程 -vv -vvv更详细
-t 指定执行的tags名称
示例:
ansible-playbook file.yml --check 只检测
ansible-playbook --syntax-check file.yml 检查yaml文件是否正确
ansible-playbook file.yml --limit webserver 指定执行的机器
ansible-playbook file.yml --list-hosts # 查看主机
ansible-playbook file.yml --list-tasks #查看任务列表
ansible-playbook file.yml --list-tags # 查看标签

注意 :上图中copy连续使用两次,这是错误操作,这种操作只会执行最下面的copy,其余copy不会执行!!应该将其分开,分为两个name。

Playbook VS ShellScripts
安装httpd
SHELL脚本
#!/bin/bash
# 安装Apache
yum install --quiet -y httpd
# 复制配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 启动Apache,并设置开机启动
service httpd start
chkconfig httpd onPlaybook定义
---
- hosts: allremote_user: roottasks:- name: "安装Apache"yum: name=httpd yum模块:安装httpd- name: "复制配置文件"copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/ copy模块: 拷贝文件- name: "复制配置文件"copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/ - name: "启动Apache,并设置开机启动"service: name=httpd state=started enabled=yes service模块: 启动服务
忽略错误 ignore_errors
如果一个task出错,默认将不会继续执行其他task
利用ignore_errors:yes 可以忽略次task的错误,继续指定playbook其他task
---
- hosts: alltasks:- name: errorignore_errors: yes
handlers和notify结合使用触发条件
handlers
是tasks列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
notify 此action可用于在每个play的最后被出发,这样可以避免多次有改变发生时,每次都执行指定的操作,仅在所有的变化发生完后一次性执行指定的操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
注意:
如果多个task通知了相同的handlers,此handlers仅会在所有task结束后运行一次
只有notify对应的task发生改变才会通知handlers
handlers实在所有前面的task执行成功之后才触发,可以使用force_handlers: yes强制执行handlers
- hosts: allremote_user: rootforce_handlers: yes #强制执行handlerstasks:- name: install Apacheyum: name=httpd state=installed- name: copy confcopy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yesnotify: service restart- name: service Apacheservice: name=httpd state=started enabled=yeshandlers:- name: service restartservice: name=httpd state=restarted
小贴士:selinux的开启导致apache更换端口后启动不成功。

playbook中tags的使用

ansible-playbook -t conf httpd.yml 【使用-t 指定标签名字】
ansible-playbook -t conf,service httpd.yml
ansible-playbook httpd.yml --list-tsgs #查看标签列表
注意:tags标签命名可以相同,不通模块下写入相同tags标签,执行时,打入标签的模块会同时执行
playbook中变量的使用
变量名:仅能由字母、数字和下划线组成,且只能以字母开头 (setup模块,显示主机所有变量)
变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量
变量来源
使用setup变量示例:var.yml- hosts: websrvsremote_user: roottasks:- name: create log filefile: name=/var/log/ {{ ansible_fqdn }} state=touchansible-playbook var.ymlansible setup facts 远程主机的所有变量都可直接调用 (系统自带变量)setup模块可以实现系统中很多系统信息的显示可以返回每个主机的系统信息包括:版本、主机名、cpu、内存ansible all -m setup -a 'filter="ansible_nodename"' 查询主机名ansible all -m setup -a 'filter="ansible_memtotal_mb"' 查询主机内存大小ansible all -m setup -a 'filter="ansible_distribution_major_version"' 查询系统版本ansible all -m setup -a 'filter="ansible_processor_vcpus"' 查询主机cpu个数2> 在/etc/ansible/hosts(主机清单)中定义变量普通变量:主机组中主机单独定义,优先级高于公共变量(单个主机 )公共(组)变量:针对主机组中所有主机定义统一变量(一组主机的同一类别)通过命令行传递变量在运行playbook的时候也可以传递一些变量供playbook使用
示例:var.yml
- hosts: websrvsremote_user: roottasks:- name: install packageyum: name={{ pkname }} state=presentansible-playbook –e pkname=httpd var.yml通过命令行指定变量,优先级最高
在playbook中定义
示例:var.yml
- hosts: websrvsremote_user: root
vars:- username: user1- groupname: group1
tasks:- name: create groupgroup: name={{ groupname }} state=present- name: create useruser: name={{ username }} state=presentansible-playbook var.yml
ansible-playbook -e "username=user2 groupname=group2” var2.yml变量文件中引用
cat vars.yml
var1: httpd
var2: nginxcat var.yml
- hosts: webremote_user: rootvars_files:- vars.ymltasks:- name: create httpd logfile: name=/app/{{ var1 }}.log state=touch- name: create nginx logfile: name=/app/{{ var2 }}.log state=touchhostname app_81.magedu.com hostname 不支持"_",认为"_"是非法字符
hostnamectl set-hostname app_80.magedu.com 可以更改主机名
在role中定义变量命名:变量名仅能由字母、数字和下划线组成,且只能以字母开头变量定义:key=value示例:http_port=80变量调用方式:1> 通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用“{{ variable_name }}”才生效2> ansible-playbook –e 选项指定ansible-playbook test.yml -e "hosts=www user=magedu"
在主机清单中定义变量,在ansible中使用变量
vim /etc/ansible/hosts
[appsrvs]
192.168.38.17 http_port=817 name=www
192.168.38.27 http_port=827 name=web调用变量
ansible appsrvs -m hostname -a'name={{name}}' 更改主机名为各自被定义的变量 针对一组设置变量
[appsrvs:vars]
make="-"ansible appsrvs -m hostname -a 'name={{name}}{{mark}}{{http_port}}' ansible调用变量针对主机和主机组的变量
主机变量
可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用
[websrvs]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=8080 maxRequestsPerChild=909组变量
组变量是指赋予给指定组内所有主机上的在playbook中可用的变量[websrvs]www1.magedu.comwww2.magedu.com[websrvs:vars]ntp_server=ntp.magedu.comnfs_server=nfs.magedu.com普通变量[websrvs]192.168.99.101 http_port=8080 hname=www1192.168.99.102 http_port=80 hname=www2公共(组)变量[websvrs:vars]http_port=808mark="_"[websrvs]192.168.99.101 http_port=8080 hname=www1192.168.99.102 http_port=80 hname=www2ansible websvrs –m hostname –a ‘name={{ hname }}{{ mark }}{{ http_port }}’组嵌套
inventory中,组还可以包含其它的组,并且也可以向组中的主机指定变量。
这些变量只能在ansible-playbook中使用,而ansible命令不支持[apache]httpd1.magedu.comhttpd2.magedu.com[nginx]ngx1.magedu.comngx2.magedu.com[websrvs:children]apachenginx[webservers:vars]ntp_server=ntp.magedu.com
invertory参数
invertory参数:用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量ansible_ssh_hostansible_ssh_portansible_ssh_useransible_ssh_passansbile_sudo_pass示例:cat /etc/ansible/hosts[websrvs]192.168.0.1 ansible_ssh_user=root ansible_ssh_pass=magedu192.168.0.2 ansible_ssh_user=root ansible_ssh_pass=magedu
模板templates
文本文件,嵌套有脚本(使用模板编程语言编写)
jinja2语言,使用字面量,有下面形式:
字符串:使用单引号或者双引号
数字:整数,浮点数
列表:[item1,itme2,…]
元组:(item1,itme2,…)
字典:{key1:value1,key2:value2,…}
布尔型:true/false
算术运算:+,-,*,/,//,%,**
比较操作:==,!=,>,>=,<,<=
逻辑运算:and,or,not
流表达式:For If When(循环语句)
小记:在模板目录template下写入模板文件,文件中可以直接调用setup变量(src可以直接书写模板目录下的文件)
迭代与条件判断
when
条件测试:如果需要根据变量,facts或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式
when语句
在task后添加when子句即可使用户条件测试;when语句支持jinji2表达式语法
示例:
- name: ‘shutdown redhad flavored systems’
command: /sbin/shutdown -h now
when: ansible_os_family == “RedHat”
迭代:with_items
迭代:当有需要重复执行的任务时,可以使用迭代机制
对迭代项的引用,固定变量名为“iftem”
要在task中使用with_items给定要迭代的元素列表
列表格式:
字符串
字典

迭代嵌套子变量

playbook中template模板对于for if 循环的使用


for
yml文件
---
- hosts: web serverremote_user: rootvars:ports:- listen_port: 84- listen_port: 85- listen_port: 86tasks:- name: copy conftemplate: src=for1.conf.j2 dest=/data/for1.conf
模板文件:
{% for port in ports %} #port自定义变量
server{listen {{ port.listen_port }}
}
{% endfor %}
&&
yml文件
---
- hosts: webremote_user: rootvars:ports:- web1:port: 81name: web1.magedu.comrootdir: /data/website1- web2:port: 82name: web2.magedu.comrootdir: /data/website2tasks:- name: copy conftemplate: src=for2.conf.j2 dest=/data/for2.conf模板文件:
{% for p in ports %} #p自定义变量
server{listen {{ p.port }}servername {{ p.name }}documentroot {{ p.rootdir }}
}
{% endfor %}
if
yml文件
---
- hosts: webremote_user: rootvars:ports:- web1:port: 81name: web1.magedu.comrootdir: /data/website1- web2:port: 82#name: web2.magedu.comrootdir: /data/website2tasks:- name: copy conftemplate: src=if.conf.j2 dest=/data/if.conf模板文件:
{% for p in ports %}
server{listen {{ p.port }}
{% if p.name is defined %} #如果p.name被定义就执行下面的servername,否则不执行servername {{ p.name }}
{% endif %}documentroot {{ p.rootdir }}
}
{% endfor %}

roles
ansible自1.2版本引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于主机构建服务的场景中,但也可以使用于构建守护进程等场景中
复杂场景:建议使用roles,代码复用度高
变更指定主机或主机组
如命令不规范,维护和传承成本大
某些功能需要多个playbook,通过includes可以实现
roles的使用

roles目录结构
playbook.yml
roles
project/
tasks/
files/
vars/ 不常用
defaults/ 不常用
templates/
handlers/
meta/ 不常用
roles各目录的作用
/roles/project/:项目名称,有以下目录
files/:存放由copy模块或scripts模块等调用的文件
template/:template模块查找所需要模板文件的目录
tasks/:定义tasks,roles的基本元素,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用
handlers/:至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用
vars/:定义变量,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件;其他的文件需要在此文件中通过include进行调用
default/:设定默认变量时使用此目录中的main.yml文件
相关文章:
深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(下)
文章目录 六、playbook运行playbook方式Playbook VS ShellScripts忽略错误 ignore_errorshandlers和notify结合使用触发条件playbook中tags的使用playbook中变量的使用invertory参数模板templates迭代与条件判断迭代:with_items迭代嵌套子变量roles 六、playbook 运…...
使用go生成、识别二维码
1、下载 # 创建目录 # 进入目录 # 执行 go mod init xxx 命令(即:在当前目录初始化创建一个模块)# 下载gozxing go get github.com/makiuchi-d/gozxing 2、生成二维码 package mainimport ("image/png""os""gith…...
LLama系列模型简要概述
LLama-1(7B, 13B, 33B, 65B参数量;1.4T tokens训练数据量) 要做真正Open的AI Efficient:同等预算下,增大训练数据,比增大模型参数量,效果要更好 训练数据: 书、Wiki这种量少、质量高…...
2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判
2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判 完整代码请私聊 博主 一、背景 在各类学科竞赛中,常常要求参赛者提交 Excel 或/和 PDF 格式的竞赛作品。 本赛题以某届数据分析竞赛作品的评阅为背景,要求参赛者根据给定的评分准则和标准答案&a…...
MYSQL表联接算法深入研究
在关系型数据库中,表联接是一种常见的操作,它使得我们可以根据不同的条件将多个表中的数据进行连接。而MySQL作为一种常用的关系型数据库,其表联接算法包括NLJ、BNL、BKA、BNLH等多种,在实际应用中选择不同的算法还需要考虑到数据…...
markdown中画图功能mermaid
mermaid Mermaid 是一种开源的可交互式的数据可视化库,它使用 Markdown 标记语言来生成图表和流程图。它通常用于生成网站或文档中的图表。Mermaid 不属于任何公司,而是一个由社区开发和维护的开源项目。 官方网站: https://mermaid-js.git…...
SCI论文丨机器学习与深度学习论文
目录 第一章、ChatGPT-4o使用方法与技巧 第二章、ChatGPT-4o辅助文献检索、总结与分析 第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计 第四章、ChatGPT-4o辅助学术论文开题与大纲生成 第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍 第六章、ChatGPT…...
linux系统编程(二)
1、fcntl #include <unistd.h> int fcntl(int fd, int cmd, ...)fcntl用于控制文件描述符,该系统调用有很多功能,功能用cmd来控制,fcntl后面的参数根据cmd来填充。 我们常用的cmd有: F_GETFL:获取文件状态标志…...
uni-app登录界面样式
非常简洁的登录、注册界面模板,使用uni-app编写,直接复制粘贴即可,无任何引用,全部公开。 废话不多说,代码如下: login.vue文件 <template><view class"screen"><view class"…...
windows C#-定义抽象属性
以下示例演示如何定义抽象属性。 抽象属性声明不提供属性访问器的实现,它声明该类支持属性,而将访问器实现留给派生类。 以下示例演示如何实现从基类继承抽象属性。 此示例由三个文件组成,其中每个文件都单独编译,产生的程序集由…...
ERROR: KeeperErrorCode = NoNode for /hbase/master
原因分析 通过上面的情景模拟,我们可以看到报错的原因在于zookeeper中出现问题,可能是zookeeper中的/hbase/master被删除,或者是在hbase集群启动之后重新安装了zookeeper,导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...
Deepin 23 踩坑记
(首发地址:学习日记 https://www.learndiary.com/2024/12/deepin23-questions/) Deepin 23 是由统信软件技术有限公司牵头开发一款开源 Linux 桌面操作系统(参考链接1),从2022年发布预览版(参考…...
mysql笔记——索引
索引 InnoDB采用了B树索引结构。 相比于二叉树,层级更少,搜索效率高。 B树中叶子节点和非叶节点都会存储数据,导致段页式存储中一页存储的键值减少,指针也会减少,要同样保存大量数据,只能增加树的高度&a…...
考研数据结构——简答题总结
数据结构的4种基本结构及特点: 数组(Array): 特点:数组是一种线性数据结构,使用连续的内存空间存储元素,可以通过索引直接访问任意位置的元素。优点:访问速度快,因为元…...
Qt Creator 里面设置MSVC 为 utf-8
在使用 Qt Creator 和 MSVC(Microsoft Visual C++)编译器进行开发时,我们可能会遇到中文乱码的问题。这通常是由于编码设置不正确导致的。 在 Qt Creator 中,你可以通过以下步骤设置默认编码为 UTF-8: 打开 Qt Creator,选择菜单栏中的“工具”(Tools) > “选项”(Opti…...
Java阶段三06
第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…...
Helm安装Mysql8主从复制集群
目录 一、Helm安装 二、安装mysql 1、拉取镜像 2、修改配置文件 3、创建mysql-secret 4、安装 一、Helm安装 这里不再赘叙,具体安装请参考官网 Helm | 快速入门指南 二、安装mysql 1、拉取镜像 #添加仓库 helm repo add bitnami https://charts.bitnami.c…...
嵌入式基础:Linux C语言:Day7
重点: strlen()函数\strcpy()函数\strcat实现\strcmp()实现 数组的清空:bzero函数、memset函数 一、字符数组 <1> 概念 字符数组本质上就是一个数组,保存一个个字符,也一般用来保存字符串 字符串由多个字符组成的一个字符…...
Tablesaw封装Plot.ly实现数据可视化
上文介绍tablesaw的数据处理功能,本文向你展示其数据可视化功能,并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分,无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…...
RAG与Embedding:现代NLP的核心技术
本篇文章简单梳理我在了解RAG以及Embedding技术时的想法,仅供参考 文章目录 1. 引言背景为什么要关注RAG与Embedding技术 2. 基础概念与原理2.1 什么是RAG (Retrieval-Augmented Generation)定义工作流程优点与适用场景 2.2 什么是Embedding定义作用 3. Embedding在…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
