掌握 Ansible 快速任务的关键即席命令

使用Ansible ad-hoc命令进行快速检查、一次性修复、文件更改和事实收集,无需编写剧本。

掌握快速Ansible任务的必备Ad-Hoc命令

Ansible ad-hoc命令允许你在一个主机或整个组上运行一个快速任务。当你需要测试访问、检查磁盘空间、复制文件、重启服务或检查事实而无需先编写剧本时,它们非常有用。

它们不能替代剧本。将它们用于即时工作,然后将重复或高风险的任务转移到版本控制的自动化中。

基本命令结构

Ad-hoc命令遵循以下格式:

ansible <模式> -m <模块名> -a "<模块参数>" [选项]

主机模式选择清单目标。模块决定Ansible做什么。参数传递模块特定的值。

常见选项包括:

  • -i <清单>--inventory <清单>:使用特定的清单文件或清单源。
  • -u <用户>--user <用户>:以特定远程用户身份连接。
  • -b--become:使用权限提升,通常是sudo。
  • -k--ask-pass:询问SSH密码。
  • -K--ask-become-pass:询问sudo密码。
  • --limit <子集>:进一步缩小选中的主机范围。

如果不传递-i,Ansible会使用其配置的清单。在许多系统上,这是/etc/ansible/hosts,但你的ansible.cfg可以更改它。

使用ping测试访问

ping模块不发送ICMP回显包。它通过Ansible的正常传输连接,在目标上运行一个小模块,并期望返回pong

ansible all -m ping

对于一个组:

ansible webservers -m ping

成功的结果如下:

web01.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

如果失败,在排查更高级任务之前,先修复清单、DNS、SSH密钥、远程用户、sudo设置或Python可用性。

使用command运行简单命令

command模块直接在远程主机上运行程序。它不调用shell,因此管道、重定向、通配符扩展和$VARIABLE扩展不会像在终端中那样工作。

检查运行时间:

ansible webservers -m command -a "uptime"

检查磁盘使用情况:

ansible all -m command -a "df -h"

使用sudo列出受保护的目录:

ansible dbservers -m command -a "ls -l /var/log" --become

当你不需要shell功能时,首先使用command。它更容易推理,并避免意外的shell解释。

仅在需要Shell功能时使用shell

shell模块通过远程主机上的shell运行命令。用于管道、重定向、变量扩展和shell条件。

查找最大的日志目录:

ansible databases -m shell -a "du -sh /var/log/* | sort -rh | head -n 5"

检查远程环境变量:

ansible all -m shell -a "printf '%s\n' \"$PATH\""

小心动态输入。如果用户提供的值在没有引号和验证的情况下插入到shell命令中,可能会造成命令注入漏洞。

对于文件编辑,优先使用专用模块而不是shell重定向。例如,使用lineinfile添加受管理的行:

ansible webservers -m lineinfile -a "path=/etc/app/app.conf line='feature_enabled=true' create=yes" --become

这比使用echo ... >> file追加更安全且更可重复。

使用copy复制文件

copy模块将文件从控制节点传输到受管主机。

ansible webservers -m copy -a "src=./myscript.sh dest=/tmp/myscript.sh mode=0755"

复制需要root所有权的配置文件:

ansible all -m copy -a "src=./app.conf dest=/etc/app/app.conf owner=root group=root mode=0644" --become

如果目标已有相同内容和元数据,Ansible报告无更改。

使用file管理路径

使用file模块创建目录、删除路径、设置所有权、设置权限或创建符号链接。

创建目录:

ansible appservers -m file -a "path=/opt/my_app state=directory mode=0755 owner=app group=app" --become

删除旧文件:

ansible host1 -m file -a "path=/tmp/old_file.txt state=absent"

创建符号链接:

ansible appservers -m file -a "src=/opt/my_app/releases/current dest=/opt/my_app/current state=link"

使用setup收集事实

setup模块收集关于主机的事实,包括操作系统、网络、CPU、内存和设备详细信息。

从一个主机收集所有事实:

ansible webserver1 -m setup

当你只需要一小部分时过滤事实:

ansible all -m setup -a "filter=ansible_distribution*"

输出可能很大,因此过滤使故障排除更易读。

选择Ad-Hoc命令或剧本

使用ad-hoc命令进行快速检查和一次性任务:

  • 使用ping测试连接。
  • 使用command检查状态。
  • 使用copy复制一个已知文件。
  • 使用file创建或删除一个路径。
  • 在故障排除期间收集事实。

当任务重复、多步骤、需要团队成员审查或风险较高需要版本控制和可预测结构时,使用剧本。

运行前的安全检查

在运行任何破坏性操作之前检查主机模式:

ansible webservers --list-hosts

当你想要更小的影响范围时使用--limit

ansible all --limit web01.example.com -m ping

记住commandshell不是自动幂等的。像useradd deploy这样的命令在第二次运行时可能会失败,除非你防御性地编写它。像userfilecopylineinfile这样的模块通常提供更安全的重复行为。

要点

Ansible ad-hoc命令最适合快速、有针对性的操作。从ping开始,使用command进行简单检查,保留shell用于真正的shell语法,并在匹配任务时优先使用copyfilelineinfilesetup等模块。