掌握 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
记住command和shell不是自动幂等的。像useradd deploy这样的命令在第二次运行时可能会失败,除非你防御性地编写它。像user、file、copy和lineinfile这样的模块通常提供更安全的重复行为。
要点
Ansible ad-hoc命令最适合快速、有针对性的操作。从ping开始,使用command进行简单检查,保留shell用于真正的shell语法,并在匹配任务时优先使用copy、file、lineinfile和setup等模块。