一. 简述:
ansible的ad-hoc是一个概念性的名字,是相对于ansible playbook而言。类似于:通过命令行来执行一些简单的,一次性的playbook任务(通俗点就是通过命令行执行一些简单的,而又不需要将命令特殊保存起来的任务)。Ansible提供两种方式去完成任务,一是 ad-hoc 命令(/usr/bin/ansible),一是写 Ansible playbook.前者可以解决一些简单的任务, 后者(/usr/bin/ansible-playbook)解决较复杂的任务。
目前ansible自带了很多模块,可使用ansible-doc -l查看所有模块,也可通过"ansible-doc 模块名" 查看模块的介绍及案例。需要注意的是ad-hoc有一些插件无法使用(只能通过playbook),如loop facts等
二. 运行流程/原理:
Ad-hoc执行过程中,主要涉及到以下流程:
1. 解析命令行参数:在命令行中输入 ansible 并附带相应的参数时,Ansible 解析这些参数以确定要连接的目标主机、使用的模块以及传递给模块的参数。
2. 加载inventory文件:ansible 需要知道目标主机的信息,这通常是通过读取一个或多个 inventory 文件来完成的。inventory 文件定义了哪些机器是受管节点(Managed Nodes),它们如何分组,以及连接到这些节点所需的凭据和其他设置。
3. 建立连接:根据 Inventory 文件中的信息,ansible 使用 SSH 或其他通信协议与目标主机建立连接。默认情况下,ansible 使用 SSH 来进行远程执行。对于 windows 主机,可以使用 winrm 协议。
4. 推送执行模块:建立连接后,ansible 会将所选模块及其参数打包成 JSON 格式的数据结构,并通过 SSH 发送到目标主机上临时目录中。然后,在远程主机上执行该模块代码。每个模块都是一个独立的小程序,负责执行特定的任务,如运行命令、复制文件、管理服务等。模块完成后,会返回结果给控制节点。
5. 收集和处理输出:模块执行完毕后,会生成一个包含任务状态(成功或失败)、标准输出、错误信息等在内的结果字典。结果会被发送回控制节点。ansible支持通过回调插件自定义输出格式。
6. 清理脏数据:ansible在任务完成后会从远程主机上删除临时创建的文件和目录。
执行命令:
ansible命令是并发执行的, 默认由ansible.cfg中forks控制,也可在命令行通过-f指定。如:
# ansible test -i aaaa -m shell -a 'uname' -f 5 -u web -o #web用户身份
10.5.11.11 | SUCCESS | rc=0 | (stdout) Linux
10.5.11.12 | SUCCESS | rc=0 | (stdout) Linux(注:shell模块与command模块区别在于command模块不支持shell变量,管道等,故执行shell命令时还是用shell模块比较好)
三. 异步执行ad-hoc:
所谓异步执行,通俗点就是放后台执行(类似于Linux的&) ,在执行时会返回一个job id值,通过id可查看后台执行的状态,可在任务时间较长的情况下使用, 主要使用-B 和-P 参数:
查看运行的状态,可以使用 async_status 模块将上图中的job_id传入即可:
四. ansible Ad-hoc 返回状态:
主要包含:
ok | 任务已经成功完成,并且没有对系统进行任何更改。 |
changed | 任务成功完成并且对系统进行了更改。 |
failed | 任务未能成功完成。 |
unreachable | 无法与目标主机建立连接。 |
skipped | 任务被跳过,通常是由于条件判断(如 |
Ad-hoc 命令返回的状态信息是理解和调试任务执行情况的重要工具。通过了解不同状态的含义,可以更好地评估任务的效果,并根据需要采取适当的措施。
----------------------------------------------------------------------------------------------
深耕运维行业多年,擅长linux、容器云原生、运维自动化等方面。
承接各类运维环境部署、方案设计/实施、服务代运维工作,欢迎沟通交流 !