block任务块、rescue和always、loop循环、role角色概述、role角色应用、ansible-vault、sudo提权、特殊的主机清单变量
任务块
- 可以通过block关键字,将多个任务组合到一起
- 可以将整个block任务组,一起控制是否要执行
# 如果webservers组中的主机系统发行版是Rocky,则安装并启动nginx[root@pubserver ansible]# vim block1.yml---- name: block taskshosts: webserverstasks:- name: define a group of tasksblock:- name: install nginx # 通过yum安装nginxyum:name: nginxstate: present- name: start nginx # 通过service启动nginx服务service:name: nginxstate: startedenabled: yeswhen: ansible_distribution=="Rocky" # 条件为真才会执行上面的任务[root@pubserver ansible]# ansible-playbook block1.yml
rescue和always
-
block和rescue、always联合使用:
- block中的任务都成功,rescue中的任务不执行
- block中的任务出现失败(failed),rescue中的任务执行
- block中的任务不管怎么样,always中的任务总是执行
[root@pubserver ansible]# vim block2.yml---- name: block testhosts: webserverstasks:- name: block / rescue / always test1block:- name: touch a filefile:path: /tmp/test1.txtstate: touchrescue:- name: touch file test2.txtfile:path: /tmp/test2.txtstate: touchalways:- name: touch file test3.txtfile:path: /tmp/test3.txtstate: touch# 执行playbook web1上将会出现/tmp/test1.txt和/tmp/test3.txt[root@pubserver ansible]# ansible-playbook block2.yml[root@web1 ~]# ls /tmp/test*.txt/tmp/test1.txt /tmp/test3.txt# 修改上面的playbook,使block中的任务出错[root@web1 ~]# rm -f /tmp/test*.txt[root@pubserver ansible]# vim block2.yml---- name: block testhosts: webserverstasks:- name: block / rescue / always test1block:- name: touch a filefile:path: /tmp/abcd/test11.txtstate: touchrescue:- name: touch file test22.txtfile:path: /tmp/test22.txtstate: touchalways:- name: touch file test33.txtfile:path: /tmp/test33.txtstate: touch# 因为web1上没有/tmp/abcd目录,所以block中的任务失败。但是playbook不再崩溃,而是执行rescue中的任务。always中的任务总是执行[root@pubserver ansible]# ansible-playbook block2.yml[root@web1 ~]# ls /tmp/test*.txt/tmp/test22.txt /tmp/test33.txt
loop循环
- 相当于shell中for循环
- ansible中循环用到的变量名是固定的,叫item
# 在test组中的主机上创建5个目录/tmp/{aaa,bbb,ccc,ddd,eee}[root@pubserver ansible]# vim loop1.yml---- name: use loophosts: webserverstasks:- name: create directoryfile:path: /tmp/{{item}}state: directoryloop: [aaa,bbb,ccc,ddd,eee]# 上面写法,也可以改为:---- name: use loophosts: webserverstasks:- name: create directoryfile:path: /tmp/{{item}}state: directoryloop: - aaa- bbb- ccc- ddd- eee[root@pubserver ansible]# ansible-playbook loop1.yml# 使用复杂变量。创建zhangsan用户,密码是123;创建lisi用户,密码是456# item是固定的,用于表示循环中的变量# 循环时,loop中每个-后面的内容作为一个整体赋值给item。# loop中{}中的内容是自己定义的,写法为key:val# 取值时使用句点表示。如下例中取出用户名就是{{item.uname}}[root@pubserver ansible]# vim loop_user.yml---- name: create usershosts: webserverstasks:- name: create multiple usersuser:name: "{{item.uname}}"password: "{{item.upass|password_hash('sha512')}}"loop:- {"uname": "zhangsan", "upass": "123"}- {"uname": "lisi", "upass": "456"}[root@pubserver ansible]# ansible-playbook loop_user.yml
role角色
- 为了实现playbook重用,可以使用role角色
- 角色role相当于把任务打散,放到不同的目录中
- 再把一些固定的值,如用户名、软件包、服务等,用变量来表示
- role角色定义好之后,可以在其他playbook中直接调用
# 使用常规playbook,修改/etc/motd的内容# 1. 创建motd模板文件[root@pubserver ansible]# vim motdHostname: {{ansible_hostname}} # facts变量,主机名Date: {{ansible_date_time.date}} # facts变量,日期Contact to: {{admin}} # 自定义变量# 2. 编写playbook[root@pubserver ansible]# vim motd.yml---- name: modifty /etc/motdhosts: webserversvars:admin: root@tedu.cn # 自定义名为admin的变量tasks:- name: modify motdtemplate:src: motddest: /etc/motd[root@pubserver ansible]# ansible-playbook motd.yml[root@web1 ~]# cat /etc/motd Hostname: web1Date: 2021-11-01Contact to: root@tedu.cn# 创建角色# 1. 声明角色存放的位置[root@pubserver ansible]# vim ansible.cfg [defaults]inventory = hostsroles_path = roles # 定义角色存在当前目录的roles子目录中# 2. 创建角色目录[root@pubserver ansible]# mkdir roles# 3. 创建名为motd的角色[root@pubserver ansible]# ansible-galaxy init roles/motd[root@pubserver ansible]# ls roles/motd # 生成了motd角色目录[root@pubserver ansible]# yum install -y tree[root@pubserver ansible]# tree roles/motd/roles/motd/├── defaults # 定义变量的目录,优先级最低│ └── main.yml├── files # 保存上传的文件(如copy模块用到的文件)├── handlers # handlers任务写到这个目录的main.yml中│ └── main.yml├── meta # 保存说明数据,如角色作者、版本等│ └── main.yml├── README.md # 保存角色如何使用之类的说明├── tasks # 保存任务│ └── main.yml├── templates # 保存template模块上传的模板文件├── tests # 保存测试用的playbook。可选│ ├── inventory│ └── test.yml└── vars # 定义变量的位置,推荐使用的位置└── main.yml# 4. 将不同的内容分别写到对应目录的main.yml中# 4.1 创建motd模板文件[root@pubserver ansible]# vim roles/motd/templates/motdHostname: {{ansible_hostname}}Date: {{ansible_date_time.date}}Contact to: {{admin}}# 4.2 创建变量[root@pubserver ansible]# vim roles/motd/vars/main.yml # 追加一行admin: zzg@tedu.cn# 4.3 创建任务[root@pubserver ansible]# vim roles/motd/tasks/main.yml # 追加- name: modify motdtemplate:src: motd # 这里的文件,自动到templates目录下查找dest: /etc/motd# 5. 创建playbook,调用motd角色[root@pubserver ansible]# vim role_motd.yml---- name: modify motd with rolehosts: webserversroles:- motd# 6. 执行playbook[root@pubserver ansible]# ansible-playbook role_motd.yml
role练习
- 创建名为pkgs的角色。用于装包。包名使用变量pkg代表
- 创建inst_nginx.yml,调用pkgs角色,安装nginx
- 创建inst_mysql.yml,调用pkgs角色,安装mysql
# 1. 创建名为pkgs的角色。# 1.1 创建角色目录[root@pubserver ansible]# ansible-galaxy init roles/pkgs# 1.2 创建装包的任务,包名使用变量pkg代表[root@pubserver ansible]# vim roles/pkgs/tasks/main.yml ---# tasks file for roles/pkgs- name: install rpm pkgyum:name: "{{pkg}}"state: present# 1.3 定义变量[root@pubserver ansible]# vim roles/pkgs/defaults/main.yml ---# defaults file for roles/pkgspkg: nginx# 2. 创建inst_nginx.yml,调用pkgs角色,安装nginx[root@pubserver ansible]# vim inst_nginx.yml---- name: install nginx pkghosts: webserversroles:- pkgs[root@pubserver ansible]# ansible-playbook inst_nginx.yml# 3. 创建inst_mysql.yml,调用pkgs角色,安装mysql-server[root@pubserver ansible]# vim inst_mysql.yml ---- name: install mysql pkghosts: dbsvars:pkg: mysql-serverroles:- pkgs[root@pubserver ansible]# ansible-playbook inst_mysql.yml
- ansible的公共角色仓库:Ansible Galaxy
# 在公共仓库中搜索与nginx相关的角色[root@myhost ~]# ansible-galaxy search nginx# 如果找到相应的角色,如名字为mynginx,可以下载它到roles目录[root@myhost ~]# ansible-galaxy install mynginx -p roles/
ansible加解密文件
- ansible加解密文件使用ansible-vault命令
[root@pubserver ansible]# echo "Hi ni hao" > hello.txt [root@pubserver ansible]# cat hello.txtHi ni hao# 加密文件[root@pubserver ansible]# ansible-vault encrypt hello.txtNew Vault password: 123456Confirm New Vault password: 123456Encryption successful[root@pubserver ansible]# cat hello.txt$ANSIBLE_VAULT;1.1;AES256373733663535663462356137313965666465333933613861313136323065636333363339633734656164323461356130303863633964393339363738653036310a666564313832316263393061616330323731333231623538643164353664393862666166613739363635633736343563653266373361656336636230366564650a3832396362306236333565656234613264313936346566663063306635336235# 解密[root@pubserver ansible]# ansible-vault decrypt hello.txtVault password: 123456Decryption successful[root@pubserver ansible]# cat hello.txt Hi ni hao# 加密后更改密码[root@pubserver ansible]# ansible-vault encrypt hello.txt New Vault password: 123456Confirm New Vault password: 123456Encryption successful[root@pubserver ansible]# ansible-vault rekey hello.txt # 改密码Vault password: 123456 # 旧密码New Vault password: abcd # 新密码Confirm New Vault password: abcdRekey successful# 不解密文件,查看内容[root@pubserver ansible]# ansible-vault view hello.txt Vault password: abcdHi ni hao# 使用密码文件进行加解密# 1. 将密码写入文件[root@pubserver ansible]# echo 'tedu.cn' > pass.txt# 2. 创建明文文件[root@pubserver ansible]# echo 'hello world' > data.txt# 3. 使用pass.txt中的内容作为密码加密文件[root@pubserver ansible]# ansible-vault encrypt --vault-id=pass.txt data.txtEncryption successful[root@pubserver ansible]# cat data.txt # 文件已加密# 4. 使用pass.txt中的内容作为密码解密文件[root@pubserver ansible]# ansible-vault decrypt --vault-id=pass.txt data.txtDecryption successful[root@pubserver ansible]# cat data.txt hello world
- 使用ansible管理远程主机,存储敏感数据时(如,文件中包含密码),应该将其加密
- 执行playbook时,通过
--ask-vault-password
选项提示输入密码
# 1. 编写有密码的playbook[root@pubserver ansible]# vim user_zhangsan.yml---- name: create a userhosts: webserverstasks:- name: create user zhangsanuser:name: zhangsanpassword: "{{'123'|password_hash('sha512')}}"# 2. 加密playbook[root@pubserver ansible]# ansible-vault encrypt user_zhangsan.ymlNew Vault password: 123456Confirm New Vault password: 123456Encryption successful# 3. 直接执行playbook,报错[root@pubserver ansible]# ansible-playbook user_zhangsan.ymlERROR! Attempting to decrypt but no vault secrets found# 4. 使用--ask-vault-password选项[root@pubserver ansible]# ansible-playbook --ask-vault-password user_zhangsan.ymlVault password: 123456
sudo命令
- 一般用于普通用户执行需要root权限的命令
- 在web1上配置zhangsan拥有sudo权限
# 如果没有zhangsan,手工创建[root@web1 ~]# visudo # 将会打开vi,在尾部追加以下一行zhangsan ALL=(ALL) ALL# 中间的ALL=(ALL)在集中认证的域环境中才有效,单机忽略即可# zhangsan是用户名,最后的ALL表示zhangsan可以以管理员的身份执行所有命令# 切换成zhangsan用户,执行命令[root@web1 ~]# su - zhangsan[zhangsan@web1 ~]$ useradd wangwu # 失败,因为还是张三身份[zhangsan@web1 ~]$ sudo useradd wangwu # 以管理员身份执行... ...[sudo] password for zhangsan: # 输入zhangsan的密码,不是root# 配置lisi不输入密码可以直接运行sudo[root@web1 ~]# visudo # 在最后追加一行lisi ALL=(ALL) NOPASSWD: ALL# 切换成lisi运行[root@web1 ~]# su - lisi[lisi@web1 ~]$ ls /root/ # 没权限ls: cannot open directory '/root/': Permission denied[lisi@web1 ~]$ sudo ls /root/ # 成功运行,无需输入密码a3.txt anaconda-ks.cfg
特殊的主机清单变量
- 如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,可以设置特殊的主机清单变量
ansible_ssh_user
:指定登陆远程主机的用户名ansible_ssh_pass
:指定登陆远程主机的密码ansible_ssh_port
:指定登陆远程主机的端口号
# 删除远程主机的/root/.ssh/authorized_keys,以便恢复通过密码登陆[root@pubserver ansible]# ansible all -m file -a "path=/root/.ssh/authorized_keys state=absent"# 创建新的工作目录[root@pubserver ~]# mkdir myansible[root@pubserver ~]# cd myansible[root@pubserver myansible]# vim ansible.cfg[defaults]inventory = inventory[root@pubserver myansible]# vim inventory[group1]web1web2db1[root@pubserver myansible]# ansible all -m ping # 报错,因为无法免密执行# 修改web1 ssh服务的端口为220[root@web1 ~]# systemctl stop firewalld[root@web1 ~]# echo 'Port 220' >> /etc/ssh/sshd_config[root@web1 ~]# systemctl restart sshd# 退出再登陆时,需要指定端口号[root@myhost ~]# ssh -p220 192.168.88.11 # 配置ssh通过用户名、密码管理远程主机,通过220端口连接web1[root@pubserver myansible]# vim inventory [group1]web1 ansible_ssh_user=root ansible_ssh_pass=a ansible_ssh_port=220web2 ansible_ssh_user=root ansible_ssh_pass=adb1 ansible_ssh_user=root ansible_ssh_pass=a[root@pubserver myansible]# ansible all -m ping
相关文章:
block任务块、rescue和always、loop循环、role角色概述、role角色应用、ansible-vault、sudo提权、特殊的主机清单变量
任务块 可以通过block关键字,将多个任务组合到一起可以将整个block任务组,一起控制是否要执行 # 如果webservers组中的主机系统发行版是Rocky,则安装并启动nginx[rootpubserver ansible]# vim block1.yml---- name: block taskshosts: webse…...

Qt:QFileDialog
目录 一、介绍 二、功能 三、具体事例 1、将某个界面保存为图片,后缀名可选PNG、JPEG、SVG等 一、介绍 QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录。 QF…...

我的QQ编程学习群
欢迎大家加入我的QQ编程学习群。 群号:950365002 群里面有许多的大学生大佬,有编程上的疑惑可以随时问,也可以聊一些休闲的东西。 热烈欢迎大家加入!! 上限:150人。...

【C++】类与对象(四)——初始化列表|explicit关键字|static成员|友元|匿名对象
前言: 初始化列表,explicit关键字,static成员,友元,匿名对象 文章目录 一、构造函数的初始化列表1.1 构造函数体内赋值1.2 初始化列表 二、explicit关键字三、static成员四、友元4.1 友元函数4.2 友元类 五、内部类六、…...

ChatGPT高效提问—prompt常见用法
ChatGPT高效提问—prompt常见用法 1.1 角色扮演 prompt最为常见的用法是ChatGPT进行角色扮演。通常我们在和ChatGPT对话时,最常用的方式是一问一答,把ChatGPT当作一个单纯的“陪聊者”。而当我们通过prompt为ChatGPT赋予角色属性后,即使…...

使用vite创建vue+ts项目,整合常用插件(scss、vue-router、pinia、axios等)和配置
一、检查node版本 指令:node -v 为什么要检查node版本? Vite 需要 Node.js 版本 18,20。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 二、创…...

泛型、Trait 和生命周期(上)
目录 1、提取函数来减少重复 2、在函数定义中使用泛型 3、结构体定义中的泛型 4、枚举定义中的泛型 5、方法定义中的泛型 6、泛型代码的性能 每一门编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型(generics)。泛型是具体类型…...
<网络安全>《18 数据安全交换系统》
1 概念 企业为了保护核心数据安全,都会采取一些措施,比如做网络隔离划分,分成了不同的安全级别网络,或者安全域,接下来就是需要建设跨网络、跨安全域的安全数据交换系统,将安全保障与数据交换功能有机整合…...

Kafka 生产调优
Kafka生产调优 文章目录 Kafka生产调优一、Kafka 硬件配置选择场景说明服务器台数选择磁盘选择内存选择CPU选择 二、Kafka Broker调优Broker 核心参数配置服役新节点/退役旧节点增加副本因子调整分区副本存储 三、Kafka 生产者调优生产者如何提高吞吐量数据可靠性数据去重数据乱…...

springboot162基于SpringBoot的体育馆管理系统的设计与实现
体育馆管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕…...

Interpolator:在Android中方便使用一些常见的CubicBezier贝塞尔曲线动画效果
说明 方便在Android中使用Interpolator一些常见的CubicBezier贝塞尔曲线动画效果。 示意图如下 import android.view.animation.Interpolator import androidx.core.view.animation.PathInterpolatorCompat/*** 参考* android https://yisibl.github.io/cubic-bezier* 实现常…...

Nacos安装,服务注册,负载均衡配置,权重配置以及环境隔离
1. 安装 首先从官网下载 nacos 安装包,注意是下载 nacos-server Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos 下载完毕后,解压找到文件夹bin,文本打开startup.cmd 修改配置如下 然后双击 startup.cmd 启动 nacos服务,默认…...
Vue3导出数据为txt文件
在Vue3中,可以通过使用Blob对象以及URL.createObjectURL()方法导出txt文档。 首先,你需要在Vue组件中创建一个方法来生成txt文档的内容。 //res.value.code 数据源 //type:格式设置 //form.name是下载文件的自定义名字 const downLoad ()&…...
Simulink中getConfigSet用法
目录 语法 说明 示例 获取配置集 getConfigSet的功能是从模型中获取配置集或配置引用。 语法 myConfigObj getConfigSet(model, configObjName) 说明 myConfigObj getConfigSet(model, configObjName) 返回关联到 model 并命名为 configObjName 的配置集或配置引用。 …...

【Algorithms 4】算法(第4版)学习笔记 05 - 2.2 归并排序
文章目录 前言参考目录学习笔记1:归并排序的简单演示1.1:基本思路1.2:归并排序的 demo 演示1.3:代码实现2:自顶向下的归并排序2.1:比较次数与访问次数的证明2.2:代码优化2.3:优化后代…...
mybatis mapper sql include用法实现sql块复用
一、总SQL <select id"getxxxMonitorData"resultType"com.xxx.module.system.dal.dataobject.xxx.xxxDO"><include refid"getxxxMonitorDataBaseSql"></include><include refid"whereContent"></include&…...

正点原子--STM32通用定时器学习笔记(2)
1. 通用定时器输入捕获部分框图介绍 捕获/比较通道的输入部分(通道1) 采样频率:控制寄存器 1(TIMx_CR1)的CKD[1:0] ⬇⬇⬇滤波方式选择: 捕获/ 比较模式寄存器 1(TIMx_CCMR1)的输入捕获部分⬇⬇…...
Flask实现异步调用sqlalchemy的模型类
事情是这样的,我这边需要在一次请求里面,搞一个异步不阻碍的任务,来执行耗时的操作。 一开始,我准备写的代码是这样的: from flask import Flask import time from concurrent.futures import ThreadPoolExecutorexec…...
Pocket2Mol + Generation of Atom Positions生成原子位置的方法有什么?联合概率是什么?
联合概率: 联合概率是统计学中的一个概念,用于描述两个或多个随机事件同时发生的概率。当我们谈论多个变量的联合概率时,我们是在探讨这些变量同时取特定值的概率。 让我们简化一下概念: 假设你有一个骰子(六面&…...
区分手机小程序以及电脑小程序;左滑、导航键返回拦截
1、区分电脑小程序和手机小程序 //区分电脑小程序、手机小程序(目标:手机小程序) // #ifdef MP-WEIXIN uni.getSystemInfo({success: (res) > {// windows | mac为pc端// android | ios为手机端// console.log(getSystemInfo,, res.plat…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...