当前位置: 首页 > news >正文

[ansible系列]ansible使用扩展

目录

一.  本地执行

二.  任务委托 

三.  任务暂停

四.  滚动执行

五.  只执行一次

六.  设置环境变量

七.  交互提示 


一.  本地执行

         我们知道ansible的是操作被控端的,所有执行的动作都是在被控端上完成的,当然在某些特定的时候我们想要有些tasks在本地(控制端)执行,这时我们就需要使用local_action语句。

        前面我们提到过lookup的用法就是在控制端执行指令,将返回结果存储到变量中。然而我们的本地执行(local_action)也可以这样做,其实这样的用法也是最多的。

示例1: 通过local_action语句,获取控制端的信息,并存储为变量。

         local_action语句的用法是 connection: local 关键字

[root@clinet include]# cat local_action.yml 
- hosts: testgather_facts: no tasks:- name: local action infoshell: cmd: cat /tmp/1.txtregister: system_info connection: local- name: debug info debug:msg: - "{{ system_info.stdout }}"- "{{ inventory_hostname  }}"
[root@clinet include]# 
[root@clinet include]#

 执行结果:

[root@clinet ansible_2]# ansible-playbook yum_file/include/local_action.yml PLAY [test] *********************************************************************************************************************************************************************************************TASK [local action info] ********************************************************************************************************************************************************************************
changed: [192.168.194.129]TASK [debug info] ***************************************************************************************************************************************************************************************
ok: [192.168.194.129] => {"msg": ["client", "192.168.194.129"]
}PLAY RECAP **********************************************************************************************************************************************************************************************
192.168.194.129            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   [root@clinet ansible_2]# 

二.  任务委托 

        在有些时候,我们希望运行与选定的主机或主机组相关联的task,但是这个task又不需要在选定的主 机或主机组上执行,而需要在另一台服务器上执行。

这种特性适用于以下场景:

·  在告警系统中启用基于主机的告警

·  向负载均衡器中添加或移除一台主机

·  在dns上添加或修改针对某个主机的解析

·  在存储节点上创建一个存储以用于主机挂载

·  使用一个外部程序来检测主机上的服务是否正常

使用delegate_to语句来在另一台主机上运行task:

‐ name: enable alerts for web servershosts: 192.168.194.129tasks:‐ name: enable alertsnagios: action:enable_alerts service:web host:"{{ inventory_hostname }}"delegate_to: 192.168.194.130

 如果delegate_to: 127.0.0.1的时候,等价于local_action

三.  任务暂停

        有些情况下,一些任务的运行需要等待一些状态的恢复,比如某一台主机或者应用刚刚重启,我们需 要需要等待它上面的某个端口开启,此时就需要将正在运行的任务暂停,直到其状态满足要求。 Ansible提供了wait_for模块以实现任务暂停的需求。

参数说明
connect_timeout在下一个任务执行之前等待连接的超时时间
delay等待一个端口或者文件或者连接到指定的状态时,默认超时时间为300秒,在这等待的 300s的时间里,wait_for模块会一直轮询指定的对象是否到达指定的状态,delay即为多长时间 轮询一次状态。
hostwait_for模块等待的主机的地址,默认为127.0.0.1
portwait_for模块待待的主机的端口
path文件路径,只有当这个文件存在时,下一任务才开始执行,即等待该文件创建完成
state等待的状态,即等待的文件或端口或者连接状态达到指定的状态时,下一个任务开始执 行。当等的对象为端口时,状态有started,stoped,即端口已经监听或者端口已经关闭;当等 待的对象为文件时,状态有present或者started,absent,即文件已创建或者删除;当等待的对 象为一个连接时,状态有drained,即连接已建立。默认为started
timeoutwait_for的等待的超时时间,默认为300秒

示例:

#等待8080端口已正常监听,才开始下一个任务,直到超时,默认等待超时时间为300s
‐ wait_for:port: 8080state: started#等待8000端口正常监听,每隔10s检查一次,直至等待超时
‐ wait_for:port: 8000delay: 10#等待8000端口直至有连接建立
‐ wait_for:host: 0.0.0.0port: 8000delay: 10state: drained#等待8000端口有连接建立,如果连接来自10.2.1.2或者10.2.1.3,则忽略。
‐ wait_for:host: 0.0.0.0port: 8000state: drainedexclude_hosts: 10.2.1.2,10.2.1.3# 等待/tmp/foo文件被创建在继续执行
- name: Wait until the file /tmp/foo is present before continuingansible.builtin.wait_for:path: /tmp/foo# 等待/tmp/foo文件被创建,且文件中包含completed,在继续执行
- name: Wait until the string "completed" is in the file /tmp/foo before continuingansible.builtin.wait_for:path: /tmp/foosearch_regex: completed# 等待/tmp/foo文件中能匹配到completed 
- name: Wait until regex pattern matches in the file /tmp/foo and print the matched groupansible.builtin.wait_for:path: /tmp/foosearch_regex: completed (?P<task>\w+)register: waitfor
- ansible.builtin.debug:msg: Completed {{ waitfor['match_groupdict']['task'] }}# 等/var/lock/file.lock被删除
- name: Wait until the lock file is removedansible.builtin.wait_for:path: /var/lock/file.lockstate: absent# 等进程结束
- name: Wait until the process is finished and pid was destroyedansible.builtin.wait_for:path: /proc/3466/statusstate: absent# 失败时输出自定义的msg信息
- name: Output customized message when failedansible.builtin.wait_for:path: /tmp/foostate: presentmsg: Timeout to find file /tmp/foo#在本地执行,等host中的主机的openssh启动,每10s检查一次,300s超时
# Do not assume the inventory_hostname is resolvable and delay 10 seconds at start
- name: Wait 300 seconds for port 22 to become open and contain "OpenSSH"ansible.builtin.wait_for:port: 22host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'search_regex: OpenSSHdelay: 10connection: local# Same as above but you normally have ansible_connection set in inventory, which overrides 'connection'
- name: Wait 300 seconds for port 22 to become open and contain "OpenSSH"ansible.builtin.wait_for:port: 22host: '{{ (ansible_ssh_host|default(ansible_host))|default(inventory_hostname) }}'search_regex: OpenSSHdelay: 10vars:ansible_connection: local

四.  滚动执行

        默认情况下,ansible会并行的在所有选定的主机或主机组上执行每一个task,但有的时候,我们会希 望能够逐台运行。最典型的例子就是对负载均衡器后面的应用服务器进行更新时。通常来讲,我们会 将应用服务器逐台从负载均衡器上摘除,更新,然后再添加回去。我们可以在play中使用serial语句 来告诉ansible限制并行执行play的主机数量。

- hosts: allgather_facts: noserial: 1

 在上述示例中,serial的值为1,即表示在某一个时间段内,play只在一台主机上执行。如果为2,则 同时有2台主机运行play。

一般来讲,当task失败时,ansible会停止执行失败的那台主机上的任务,但是继续对其他 主机执 行。在负载均衡的场景中,我们会更希望ansible在所有主机执行失败之前就让play停止,否则很可能 会面临所有主机都从负载均衡器上摘除并且都执行失败导致服务不可用的场景。这个时候,我们可以 使用serial语句配合max_fail_percentage语句使用。 max_fail_percentage 表示当最大失败主机的比 例达到多少时,ansible就让整个play失败。示例如下:

- hosts: allgather_facts: noserial: 1max_fail_percentage: 25

 假如负载均衡后面有4台主机,并且有一台主机执行失败,这时ansible还会继续运行,要让Play停止 运行,则必须超过25%,所以如果想一台失败就停止执行,我们可以将max_fail_percentage的值设 为24。如果我们希望只要有执行失败,就放弃执行,我们可以将max_fail_percentage的值设为0。

五.  只执行一次

某些时候,我们希望某个task只执行一次,即使它被绑定到了多个主机上。例如在一个负载均衡器后 面有多台应用服务器,我们希望执行一个数据库迁移,只需要在一个应用服务器上执行操作即可。

可以使用run_once语句来处理:

‐ name: run the database migrateionscommand: /opt/run_migrateionsrun_once: true

还可以与local_action配合使用,如下:

‐ name: run the task locally, only oncecommand: /opt/my‐custom‐commandconnection: localrun_once: true

 还可以与delegate_to配合使用,让这个只执行一次的任务在指定的机器上运行:

‐ name: run the task locally, only oncecommand: /opt/my‐custom‐commandrun_once: truedelegate_to: app.a1‐61‐105.dev.unp

六.  设置环境变量

        在命令行下执行某些命令的时候,这些命令可能会需要依赖环境变量。比如在安装某些包的时 候,可能需要通过代理才能完成完装。或者某个脚本可能需要调用某个环境变量才能完成运行。 ansible 支持通过 environment 关键字来定义一些环境变量。

在如下场景中可能需要用到环境变量:

·  运行shell的时候,需要设置path变量

·  需要加载一些库,这些库不在系统的标准库路径当中

示例:

‐ hosts: testtasks:‐ name: install pipyum:name: python‐pipstate: installed‐ name: install the aws toolspip:name: awsclistate: present‐ name upload file to s3shell: aws s3 put‐object ‐‐bucket=my‐test‐bucket ‐‐key={{ ansible_hostname }}/fstab ‐‐body=/etc/fstab ‐‐region=eu‐west‐1environment:AWS_ACCESS_KEY_ID: xxxxxxAWS_SECRET_ACCESS_KEY: xxxxxx

 事实上,environment也可以存储在变量当中:

‐ hosts: allremote_user: rootvars:proxy_env:http_proxy: http://proxy.example.com:8080https_proxy: http://proxy.bos.example.com:8080tasks:‐ name:  infoapt: name:cobbler state:installedenvironment: proxy_env

七.  交互提示 

 在少数情况下,ansible任务运行的过程中需要用户输入一些数据,这些数据要么比较秘密不方便, 或者数据是动态的,不同的用户有不同的需求,比如输入用户自己的账户和密码或者输入不同的版本 号会触发不同的后续操作等。ansible的vars_prompt关键字就是用来处理上述这种与用户交互的情况 的。

- hosts: testvars_prompt:- name: share_userprompt: "what is your network username?"private: yes- name: share_passprompt: "what is your network password"private: yestasks:- name: debug info1debug:var: share_user- name: debug info2debug:var: share_pass

 vars_prompt常用选项说明:

        ·  private: 默认为yes,表示用户输入的值在命令行不可见

        ·  default:定义默认值,当用户未输入时则使用默认值

        ·  confirm:如果设置为yes,则会要求用户输入两次,适合输入密码的情况


 

相关文章:

[ansible系列]ansible使用扩展

目录 一. 本地执行 二. 任务委托 三. 任务暂停 四. 滚动执行 五. 只执行一次 六. 设置环境变量 七. 交互提示 一. 本地执行 我们知道ansible的是操作被控端的&#xff0c;所有执行的动作都是在被控端上完成的&#xff0c;当然在某些特定的时候我们想要有些tas…...

Java工具类(时间格式转换)

import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL 0 * DateFormat.DEFAULT 2 * DateFormat.LONG 1 * DateFormat.MEDIUM 2 * DateFormat.SHORT 3 * author Michael * version 1.0&#xff0c; 2007/03/09 */ public c…...

数据库(第五次作业)

1.1 Redis概述 1.1.1 什么是Redis 2008年&#xff0c;意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG&#xff0c;然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望&#xff0c;于是他决定亲自为LLOOGG量身定做一个数据…...

代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

110. 平衡二叉树 题目链接 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,nul…...

套娃式工具!用 AI 识别 AI ?#AI classifier

2022年以来&#xff0c;市面上就出现了不少 AI 生成文本的工具&#xff0c;尤其是 OpenAI 推出的 ChatGPT &#xff0c;不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动…...

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口&#xff0c;报错&#xff1a;certificate has expired 因为在linux centos环境与window环境有所不同&#xff0c;在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…...

接口自动化:requests

引言&#xff1a;目前软件测试对测试人员的能力要求 业务测试能力&#xff1a;占比5-6成接口、自动化、性能测试能力&#xff1a;占比4-5成流程规范&#xff1a;1成&#xff08;需要综合型的测试人才&#xff09;&#xff1a;业务能力、代码能力、开发思维&#xff08;封装&…...

极简TypeScript教程--数据类型

TypeScript最大的特点就是有类型检测&#xff0c;格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型&#xff0c;就会在编译期报错。变量的类型推导在开发中&#xff0c;有时候为了方便起见…...

JAVA开发测试(jmeter如何测试性能与估算)

对C的业务网站或应用&#xff0c;进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具&#xff1a; Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c;来自不同压力类别下测试它们的强度和分析整体性能&#xff0c;是Apache组织开发的…...

【新解法】华为OD机试 - 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供

华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供 题目 已知连续正整数数列{K}=K1,K2,K3… Ki的各个数相加之和为S, i = N (0 < S < 100000, 0 < N < 100000), 求此数列K。 输入 输…...

Python3 File(文件) 方法

Python3 File(文件) 方法 open() 方法 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象。 在对文件进行处理过程都需要使用到这个函数&#xff0c;如果该文件无法被打开&#xff0c;会抛出 OSError。 注意&#xff1a;使用 open() 方法一定要保证关闭文件对…...

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…...

力扣(LeetCode)414. 第三大的数(2023.02.16)

给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff1a; 输入&#xff1a;[1, 2] 输出&#xff1a;2…...

Spring底层

一、什么是Spring&#xff1f;谈谈你对IOC和AOP的理解。Spring&#xff1a; 是一个企业级java应用框架&#xff0c;他的作用主要是 简化软件的开发以及配置过程&#xff0c;简化项目部署环境。Spring的有点&#xff1a;1、Spring低侵入设计&#xff0c;对业务代码的污染非常低。…...

Cache-Control 常见字段

Cache-Control 常见字段 参考&#xff1a;https://blog.csdn.net/qq_41996454/article/details/108644436 Cache-Control 可以在请求头或者响应头中设置&#xff0c;并且可以组合使用多种指令 no-cache 和 no-store 用作控制缓存&#xff0c;被服务器通过响应头 Cache-Contro…...

Flink Checkpoint 中的通用增量Checkpoint

文章目录知识点状态Flink容错恢复周期性的 Checkpoint错误检测 Failure Detected重新调度 Re-scheduling状态恢复 State Recovery通用增量Checkpoint知识点 状态 算子需要记录之前数据处理的中间结果&#xff0c;把中间结果暂时缓存在算子的内部&#xff0c;这就是算子的状态…...

金三银四必看的软件测试面试题宝典,背完offer随便拿

怎么来设计测试方案根据测试需求&#xff08;包括功能需求和非功能性需求&#xff09;&#xff0c;识别测试要点&#xff0c;识别测试环境要求&#xff0c;安排测试轮次&#xff0c;根据项目计划和开发计划做整体的测试安排。 被测试的特性&#xff1a;通过对需求规格说明书进行…...

企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

扬帆优配“数字经济+实体经济”融合发展,行业增长空间大!

组织以为&#xff0c;数字经济已经逐步成为工业商场和资本商场的共同主题。 2月16日&#xff0c;国家发改委在《求是》杂志发表文章《努力推进经济完成质的有效提升和量的合理增加》。文章指出要加速开展数字经济&#xff0c;加速实施“东数西算”等重大工程&#xff0c;推进数…...

分享82个HTML电脑主机模板,总有一款适合您

分享82个HTML电脑主机模板&#xff0c;总有一款适合您 82个HTML电脑主机模板下载链接&#xff1a;https://pan.baidu.com/s/13DGOCgvbxSksMPwJzi2z0g?pwdl0mi 提取码&#xff1a;l0mi Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 云虚拟主机运营商网站模板…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...