Ansible的使用2
#### 一、Ansible变量
##### facts变量
> facts组件是Ansible用于采集被控节点机器的设备信息,比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等
- setup模块
- 用于获取所有facts信息
```shell
## 常用参数
filter:用于过滤指定信息
# 通过setup模块查看所有facts信息
ansible web1 -m setup
# facts变量是一个由庞大的{}构成的键值字典
# 在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容
ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses"
ansible webservers -m setup -a "filter=ansible_bios_version"
ansible webservers -m setup -a "filter=ansible_memtotal_mb"
ansible webservers -m setup -a "filter=ansible_hostname"
ansible webservers -m setup -a "filter=ansible_mem*"
ansible web1 -m setup > facts.txt; awk -F: '/mb/{print}' facts.txt
```
- debug模块
- 用于基本中使用facts变量打印变量信息
- 默认有Gathering Facts任务,收集到Facts信息后可以使用该模块打印
- 调用变量格式:{{ 变量名 }}
```shell
## 常用参数
msg:打印变量值,格式为:{{ 变量名 }}
var:打印变量值,格式为:变量名
- name: test debug
hosts: webservers
tasks:
- name: test debug msg
debug:
msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}}"
- name: test debug
hosts: webservers
tasks:
- name: test debug var
debug:
var: ansible_hostname, ansible_bios_version
```
##### 自定义变量
- 通过变量的使用可以让剧本更加灵活,多次运行剧本只需要调整对应变量名即可
- Ansible支持十几种变量定义方式
- Ansible变量定义的位置,下列变量优先级从低到高
- role defaults :roles defaults目录下的变量
- inventory vars:inventory文件中定义的变量
- inventory group_vars:inventory文件组的变量
- inventory host_vars:inventory文件主机的变量
- playbook group_vars:剧本中组的变量
- playbook host_vars:剧本中主机的变量
- host facts:事实变量
- play vars:vars定义的变量
- play vars_prompt:vars_prompt定义的变量
- play vars_files:vars_files导入的变量
- registered vars:注册变量
- role and include vars:roles中单独定义的及导入的变量
- block vars (only for tasks in block):block中定义的变量
- task vars (only for the task):任务中定义的变量
- extra vars (always win precedence):命令行指定的变量
- Ansible变量定义的分类
- 节点变量
```shell
## 在inventory文件中定义变量
[webservers]
web[1:2]
[dbs]
db1 username="natasha" #定义属于db1主机的变量
……
## 定义变量在Playbook中的使用
- name: create user with host vars
hosts: db1
tasks:
- name: test host vars
user:
name: "{{ username }}"
state: present
```
- 组变量
```shell
## 在inventory文件中定义变量
[webservers]
web[1:2]
……
#定义属于组的变量,:vars是固定格式
[webservers:vars]
username="natasha"
## 定义变量在Playbook中的使用
- name: create user with group vars
hosts: webservers
tasks:
- name: test group vars
user:
name: "{{ username }}"
state: present
```
- 剧本变量
```shell
## Playbook中定义变量
- name: create user with play vars
hosts: webservers
vars: #剧本中定义变量
username: "natasha" #定义变量
password: "123456" #定义变量,数字作为密码必须用引号,表示字符串
tasks:
- name: test play vars
user:
name: "{{ username }}"
password: "{{ password|password_hash('sha512')}}"
state: present
```
- 文件变量
```shell
# 变量文件创建一个fvars.yml文件
username: "natasha"
password: "654321"
## 定义变量文件在Playbook中的使用
- name: create user with vars files
hosts: db1
vars_files: fvars.yml #调用定义变量的文件
tasks:
- name: test vars file
user:
name: "{{ username }}"
password: "{{ password | password_hash('sha512')}}"
state: present
```
##### 调用Facts变量信息收集
```shell
# 一定要开启Facts信息收集,gather_facts: yes
- name: copy file with facts
hosts: webservers
tasks:
- name: use facts
copy:
#加\n换行,显示两条信息
content: "hostname: {{ ansible_hostname }}\nbios_version: {{ ansible_bios_version }}"
dest: /tmp/facts.txt
# 验证收集
ansible webservers -a "cat /tmp/facts.txt"
```
##### Ansible补充模块
- Firewalld模块
- 该模块用于配置firewalld防火墙规则(默认拒绝访问),对于明确允许的服务设置放行操作
- 无论服务是否有名字,最终都基于TCP或UDP的端口,比如http服务基于TCP80端口。服务名和端口号对应关系的说明文件位于:/etc/services
```shell
## 常用参数
port:声明放行端口与通信类型
permanent:永久生效,但不会立即生效
immediate:立即生效,临时生效
state:enabled,放行;disabled拒绝
# 在webservers主机组安装nginx软件、启动服务
- name: test firewalld
hosts: webservers
tasks:
- name: install nginx
yum:
name: nginx
state: present
- name: start nginx
service:
name: nginx
state: started
enabled: true
curl -I http://web1;curl -I http://web2 #测试访问
# 在webservers主机组安装firewalld防火墙软件、启动服务并访问测试
- name: test firewalld
hosts: webservers
tasks:
...
- name: install firewalld
yum:
name: firewalld
state: present
- name: start firewalld
service:
name: firewalld
state: started
enabled: true
# 设置防火墙放行http访问
- name: test firewalld
hosts: webservers
tasks:
...
- name: allow http
firewalld:
port: 80/tcp
permanent: true
immediate: true
state: enabled
```
- Template模块
- 用于上传具备特殊格式的文件(如文件中包含变量),文件的语法叫Jinja2
- 被控节点接收到文件时,模板文件中的变量名会被替换成具体的值
- 相比于copy模块更加灵活
```shell
## 常用参数
src:要上传的文件
dest:目标文件路径
# 通过facts变量找到被控节点对应ip的变量
# 创建index.html.j2文件将变量对号入座,主机名对应hostname,ip地址对应address
Welcome to {{ ansible_hostname }} on {{ ansible_eth0.ipv4.address }}
- name: upload index
hosts: webservers
tasks:
- name: create web index
template:
src: index.html.j2
dest: /usr/share/nginx/html/index.html
```
#### 二、PlayBook进阶语法
##### 错误处理机制
> 当Playbook中有多个task时,其中某个任务执行过程中失败则后续任务将被终止执行
>
> 使用ignore_errors对可能出现错误的task进行忽略处理,可以作用于任务级也可作用于全局级
```shell
# 任务级忽略错误
- name: test error task
hosts: webservers
tasks:
- name: start mysqld
service:
name: mysqld
state: started
enabled: true
ignore_errors: true #任务级
- name: touch file
file:
path: /tmp/mysql.txt
state: touch
# 全局级忽略错误
- name: test error task
hosts: webservers
ignore_errors: true #全局级
tasks:
- name: start mysqld
service:
name: mysqld
state: started
enabled: true
- name: touch file
file:
path: /tmp/mysql.txt
state: touch
```
##### 触发执行任务
- 通过handlers定义一组任务
- 仅当某个任务触发(notify)handlers时才会执行相应任务
- 如果有多个notify触发执行handlers任务,也仅执行一次
- 仅当任务的执行状态为changed是handlers任务才执行
- handlers任务在所有其他任务都执行后才执行
```shell
# 获取nginx配置文件
- name: get nginx config file
hosts: webservers
tasks:
- name: fetch nginx config file
fetch:
src: /etc/nginx/nginx.conf
dest: ./
flat: yes
# 编辑获取文件的服务端口,调整为facts变量
vim +39 nginx.conf
...
listen {{ http_port }} default_server;
listen [::]:{{http_port}} default_server;
...
# 修改nginx服务端口为8000并重启服务
- name: configure nginx
hosts: webservers
vars:
http_port: 8000
tasks:
- name: upload nginx.conf
template:
src: nginx.conf
dest: /etc/nginx/nginx.conf
- name: restart nginx
service:
name: nginx
state: restarted
######执行上条命令,修改文件并重启服务,第二次执行命令,未修改文件但重启服务
# 实现目标:只有修改了配置文件才会重启服务
# 加入handlers触发器
- name: configure nginx
hosts: webservers
vars:
http_port: 80
tasks:
- name: upload nginx.conf
template:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx service #任务状态为changed时触发指定任务执行
handlers:
- name: restart nginx service
service:
name: nginx
state: restarted
####!!!!!注意notify与handlers的name要一致否则回报错
ERROR! The requested handler 'restart nginx service' was not found in either the main handlers list nor in the listening handlers list
```
##### when条件判断
- 满足条件时才执行任务,多任务使用and或or进行连接,表达逻辑关系
- when表达式中的变量不需要使用{{}}
```shell
## 常用操作符
==:相等
!=:不等
>:大于
<:小于
<=:小于等于
>=:大于等于
# 单条件测试:当目标主机内存至少4G时安装MySQL软件
- name: test when
hosts: dbs
tasks:
- name: install mysql soft
yum:
name: mysql-server
state: present
when:
ansible_memtotal_mb >= 4096
# 多条件测试:当目标主机系统为Rocky8时发送文件,/etc/motd是用户登录时屏幕显示的内容
- name: test when
hosts: webservers
tasks:
- name: modify /etc/motd
copy:
src: motd
dest: /etc/motd
when: > #多条件合并成1行
ansible_distribution == "Rocky"
and
ansible_distribution_major_version == "8"
```
##### register注册变量
- register用于捕获和保存任务执行结果,它允许将其他任务的输出作为变量使用
- register也是一个关键字,可以将任务执行的结果赋值给指定的变量名称,并在后续任务中使用
- register可以捕获各种类型的输出,包括stdout、stderr、rc、changed等并与其他模块一起使用,例如"when"条件、"loop"循环等
```shell
# 在web1主机执行创建/tmp/reg1.txt,捕获命令执行结果并打印
- name: test register
hosts: web1
tasks:
- name: create file
file:
path: /tmp/reg1.txt
state: touch
register: result
- name: display result
debug:
msg: "{{result}}"
# 在web1主机上执行任务,创建文件/tmp/abcdemo/abc。如果创建不成功,则通过debug输出create failed
- name: test register
hosts: web1
ignore_errors: true #如果不忽略则任务2无法执行
tasks:
- name: create file
file:
path: /tmp/abcdemo/abc
state: touch
register: result
- name: debug out
debug:
msg: "create failed"
when: result.failed
```
相关文章:
Ansible的使用2
#### 一、Ansible变量 ##### facts变量 > facts组件是Ansible用于采集被控节点机器的设备信息,比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等 - setup模块 - 用于获取所有facts信息 shell ## 常用参数 filter…...
Springboot JPA ShardingSphere 根据年分表java详细代码Demo
一、项目结构 src/main/java ├── com.example │ ├── config │ │ └── TableInitializer.java # 动态建表配置 │ ├── entity │ │ └── Order.java # JPA实体类 │ ├── repository │ │ └── OrderRepository.j…...
mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…...
【C++】Stack Queue 仿函数
📝前言: 这篇文章我们来讲讲STL中的stack和queue。因为前面我们已经有了string、vector和list的学习基础,所以这篇文章主要关注一些stack和queue的细节问题,以及了解一下deque(缝合怪)和priority_queue &am…...
代码随想录_单调栈
代码随想录_单调栈 739.每日温度 739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,…...
C++类与对象进阶知识深度解析
目录 一、再谈构造函数 (一)构造函数体赋值 (二)初始化列表 (三)成员变量初始化顺序 (四)explicit关键字 二、static成员 (一)概念 (二&am…...
BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码
web自动化代码: https://gitee.com/chicken-c/boost-search/tree/master/AutoTest...
【Ansible自动化运维】一、初步了解,开启自动化运维之旅
在当今数字化时代,随着企业 IT 基础设施规模的不断扩大,传统的手工运维方式逐渐显得力不从心。自动化运维技术应运而生,其中 Ansible 凭借其简洁易用、功能强大的特点,成为众多运维工程师和开发人员的首选工具。本篇文章将从基础概…...
AI日报 - 2025年4月9日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | DeepSeek AI推出自我原则批判调优(SPCT)新方法 通过GRMs自我创建和批判原则,性能媲美671B参数大模型 ▎💼 商业动向 | NVIDIA发布Llama-Nemotron-Ultra 253B模型 开放权重和训练数据&#x…...
2025年二级建造师考前冲刺题库
二建考前冲刺练习通常会涵盖考试的重点和高频考点,考生在做题过程中可以加深对这些知识点的理解和记忆,提高对重点知识的掌握程度。 建设工程法规及相关知识 1、单选题:关于建设工程中代理的说法,正确的是( …...
蓝桥·20264-祝福语--找连续字串的长度
#include <iostream> using namespace std; int main() {// 请在此输入您的代码//最小字典序,一定是全a,找s的最长字串a,结果就是该字串长度加1(t不能是s的子串)//所以这道题就变成了,找s中字串a出现的长度strin…...
条件概率、概率乘法公式、全概率公式和贝叶斯 (Bayes) 公式
定义 设 P ( A ) > 0 P(A) > 0 P(A)>0,若在随机事件 A A A发生的条件下随机事件 B B B发生的概率记作 P ( B ∣ A ) P(B|A) P(B∣A),定义 P ( B ∣ A ) P ( A B ) P ( A ) P(B|A) \frac{P(AB)}{P(A)} P(B∣A)P(A)P(AB) 则称 P ( B ∣ A ) …...
pdf转latex
Doc2X(https://doc2x.noedgeai.com/) Doc2X 是一个由 NoEdgeAI 提供的在线工具,主要用于将 PDF 文件(尤其是学术论文、报告等文档)转换为 LaTeX 格式。LaTeX 是一种高质量排版系统,广泛应用于学术界和出版…...
【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
【Unity 】Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作 在Unity开发中,Transform组件承担着场景中物体的空间信息控制,包括位置、旋转和缩放。而缩放(Scale)操作,作为三…...
【Linux篇】缓冲区的工作原理:如何影响你程序的输入输出速度
从内存到磁盘:缓冲区如何提升文件I/O效率 一. 缓冲区1.1 什么是缓冲区1.2 为什么要引入缓冲区1.3 缓冲区类型1.4 FILE1.4.1 基本概念1.4.2 FILE 结构体的作用1.4.3 FILE 的工作机制 二. 最后 在程序开发中,缓冲区是一个经常被提及却不容易深入理解的概念…...
kotlin,Android,jetpack compose,日期时间设置
AI生成,调试出来学习,这些小组件会用了,就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...
ASP.NET图书馆借阅系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,图书馆借阅系统利用计算机网络实现信息化管理,使图书信息、图书借阅、归还的管理发展和服务水平有显著提升。 本文拟…...
LeetCode算法题(Go语言实现)_35
题目 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 一、代码实现 func goodNodes(root *TreeNode) int {if root nil {return 0}return d…...
vi/vim常用快捷键
那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…...
JVM核心机制:类加载×字节码引擎×垃圾回收机制
🚀前言 “为什么你的Spring应用启动慢?为什么GC总是突然卡顿?答案藏在JVM的核心机制里! 本文将用全流程图解字节码案例,带你穿透三大核心机制: 类加载:双亲委派如何防止恶意代码入侵ÿ…...
opencv无法设置禁用RGB转换问题
树莓派连接摄像头,摄像头输出格式为YUYV(YUV422)。 通过执行 v4l2-ctl --list-formats --device/dev/video0 可以看的具体的摄像头的数据格式。 使用opencv获取视频流,通过cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)设置禁用自动转换RGB格式,但是打印输出…...
k8s 1.30.6版本部署(使用canal插件)
#系统环境准备 参考 https://blog.csdn.net/dingzy1/article/details/147062698?spm1001.2014.3001.5501 #配置下载源 curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyri…...
GZ036区块链卷一 EtherStore合约漏洞详解
题目 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function withdraw() public {uint bal balances[msg.sender…...
MCP+Blender创建电力塔
MCP(Model Context Protocol)与Blender的结合是当前AI与3D建模领域的热门技术,它通过协议化的方式让Claude等AI模型直接控制Blender,实现自动化3D建模。 1. 功能与原理 • 核心能力:用户通过自然语言指令(…...
什么是RACI矩阵,应用在什么场景?
一、什么是RACI RACI矩阵是一种用于明确项目或任务中角色与责任的管理工具,通过定义不同人员在任务中的参与程度来避免职责不清的问题。以下是其核心要点: RACI的含义 ● R(Responsible)执行者:直接完成任务…...
Selenium自动化:玩转浏览器,搞定动态页面爬取
嘿,各位爬虫爱好者和自动化达人们!是不是经常遇到这种情况:信心满满地写好爬虫,requests一把梭,结果抓下来的HTML里,想要的数据空空如也?定睛一看,原来数据是靠JavaScript动态加载出…...
QAI AppBuilder 快速上手(8): 图像修复应用实例2
LaMa-Dilated模型旨在通过扩张卷积技术实现高效的图像擦除和修复。该模型采用先进的卷积神经网络架构,能够处理复杂的图像输入,并填补图像中的缺失部分,使修复后的图像更加自然和逼真。LaMa-Dilated不仅在图像编辑领域表现出色,还…...
`ConstantPositionProperty` 的使用与应用
ConstantPositionProperty 的使用与应用 1. 什么是 ConstantPositionProperty? ConstantPositionProperty 是 Cesium 中用于表示实体位置的属性类。它表示一个实体在三维空间中的位置是固定的,不会随时间变化。与动态位置属性(如 SampledPo…...
【计网】作业4
一. 单选题(共22题,64分) 1. (单选题)主机甲采用停止-等待协议向主机乙发送数据,数据传输速率是4kb/s,单向传播时延为30ms,忽略确认帧的发送时延。当信道利用率等于80%时,数据帧的长度为&#…...
MPDrive:利用基于标记的提示学习提高自动驾驶的空间理解能力
25年4月来自南方科技大学、百度、英国 KCL和琶洲实验室(广东 AI 和数字经济实验室)的论文“MPDrive: Improving Spatial Understanding with Marker-Based Prompt Learning for Autonomous Driving”。 自动驾驶视觉问答(AD-VQA)…...
