- Ansible 命令概览:快速了解其基本结构。
- 核心命令详解:深入剖析
ansible,ansible-playbook,ansible-inventory,ansible-vault等最常用的命令。 - 常用参数详解:总结跨多个命令的通用关键参数。
- 实战示例:通过具体例子展示命令的用法。
- 总结与最佳实践。
Ansible 命令概览
Ansible 的命令通常遵循一个基本模式:

ansible <inventory_group> -m <module_name> -a '<module_arguments>'
或者对于 Playbook:
ansible-playbook <playbook_file.yml> [options]
- Inventory (清单):定义了你要管理哪些服务器(主机和主机组),这是 Ansible 执行操作的目标。
- Module (模块):Ansible 的核心,是可以在远程节点上执行的“功能单元”。
command用于执行命令,yum用于管理软件包,copy用于复制文件。 - Ad-hoc (临时命令):直接通过
ansible命令执行的单个任务,适合快速、简单的操作。 - Playbook (剧本):一个 YAML 文件,用于编排多个任务,实现复杂的、可重复的自动化流程,通过
ansible-playbook命令执行。
核心命令详解
1 ansible - Ad-hoc 临时命令
这是最基础的命令,用于快速执行一个模块任务。
语法格式:
ansible <host-pattern> [-i INVENTORY_FILE] -m MODULE_NAME -a MODULE_ARGUMENTS
参数详解:

-
<host-pattern>:指定要操作的主机或主机组。all:所有在 Inventory 中定义的主机。webservers:Inventory 文件中名为webservers的主机组。webservers:dbservers:同时操作webservers和dbservers两个组。db_server01:操作单个主机。webservers:!atlanta:操作webservers组,但排除atlanta子组中的主机。webservers:&staging:操作同时属于webservers和staging组的主机。
-
-i INVENTORY_FILE或--inventory-file=INVENTORY_FILE:指定 Inventory 文件的路径,默认为/etc/ansible/hosts,你也可以使用动态 Inventory,这里指向一个脚本或 JSON/YAML 文件。 -
-m MODULE_NAME或--module-name=MODULE_NAME:指定要使用的模块,默认为command。- 重要:
command模块是特殊的,它不会像 Shell 那样进行变量扩展、管道等操作,如果你需要这些功能,请使用shell模块。
- 重要:
-
-a MODULE_ARGUMENTS或--args=MODULE_ARGUMENTS:传递给模块的参数,通常是一个由空格分隔的键值对列表,用单引号括起来。
(图片来源网络,侵删) -
--list-hosts:列出匹配<host-pattern>的主机,但不执行任何操作,非常适合在执行前验证你的选择是否正确。 -
--syntax-check:对 Playbook 进行语法检查(主要用于ansible-playbook,但概念相通)。 -
-C或--check:检查模式,Ansible 会模拟执行任务,并预测它将做的更改,但不会真正在远程主机上执行,这是最安全的测试方式之一。 -
-D或--diff:差异模式,当文件被修改时(如copy,template,lineinfile模块),会显示文件前后的差异。 -
-u或--user:指定连接到远程主机的用户。 -
-b或--become:权限提升,切换到另一个用户执行任务,默认是root,相当于sudo。 -
--private-key=PRIVATE_KEY_FILE:指定 SSH 私钥文件路径。 -
-k或--ask-pass:交互式输入 SSH 密码。 -
-K或--ask-become-pass:交互式输入sudo密码。 -
-v或--verbose:显示详细输出,可以多次使用(如-vvv)来获取更详细的信息,用于调试。
2 ansible-playbook - 执行 Playbook 剧本
这是 Ansible 自动化的核心,用于执行定义在 YAML 文件中的任务列表。
语法格式:
ansible-playbook <playbook.yml> [options]
参数详解:
大部分参数与 ansible 命令通用,如 -i, --check, --diff, -u, -b, -v 等,这里重点介绍其特有的参数:
-
--limit:限制 Playbook 只在指定的主机或主机组上运行,这对于在测试环境验证后,再在生产环境执行非常有用。--limit webservers或--limit webservers[0:5](只运行前5台)。--limit @tags.txt:从一个文件中读取主机列表。
-
--tags:只执行带有特定标签的任务。- 一个 Playbook 中有多个任务,你可以给它们打上标签
install,configure,start,然后使用--tags install,configure来只执行这两个任务。
- 一个 Playbook 中有多个任务,你可以给它们打上标签
-
--skip-tags:跳过带有特定标签的任务。 -
--start-at-task:从指定的任务名称开始执行,对于长时间运行的 Playbook 在中断后恢复非常有用。 -
--inventory:与-i相同,指定 Inventory 文件。 -
--extra-vars:在命令行中传递变量给 Playbook。--extra-vars "package_name=httpd user_name=nginx"。
3 ansible-inventory - 管理 Inventory 文件
用于查看、导出和验证 Inventory 文件的内容。
常用子命令和参数:
ansible-inventory --list:以 JSON 格式列出 Inventory 中的所有主机和变量信息,这是获取动态 Inventory 内容的标准方式。ansible-inventory --host <hostname>:显示指定主机的所有变量信息。ansible-inventory -i <inventory_file> --graph:以图形化方式展示主机和组的层级关系,非常直观。
4 ansible-vault - 加密敏感数据
用于加密解密任何 YAML 文件,通常用于加密包含密码、API密钥等敏感信息的变量文件或整个 Playbook。
常用子命令:
ansible-vault create <file_to_encrypt>:创建一个新的加密文件。ansible-vault encrypt <file_to_encrypt>:加密一个已存在的文件。ansible-vault decrypt <file_to_encrypt>:解密一个文件。ansible-vault view <file_to_encrypt>:查看加密文件的内容,不解密文件本身。ansible-vault edit <file_to_encrypt>:编辑加密文件(会先解密,编辑后重新加密)。ansible-vault rekey <file_to_encrypt>:更改 Vault 密码。--ask-vault-pass:在执行 Playbook 时,如果文件被加密,需要此参数来输入 Vault 密码。--vault-password-file=<password_file>:从指定文件中读取 Vault 密码,避免交互式输入,适合自动化。
常用参数详解(跨命令)
| 参数 | 全称 | 描述 | 适用命令 |
|---|---|---|---|
-i |
--inventory |
指定 Inventory 文件路径 | ansible, ansible-playbook |
-u |
--user |
SSH 连接用户 | ansible, ansible-playbook |
-b |
--become |
使用权限提升(sudo) | ansible, ansible-playbook |
-C |
--check |
检查模式,模拟执行 | ansible, ansible-playbook |
-D |
--diff |
显示文件差异 | ansible, ansible-playbook |
-k |
--ask-pass |
交互式输入 SSH 密码 | ansible, ansible-playbook |
-K |
--ask-become-pass |
交互式输入 sudo 密码 | ansible, ansible-playbook |
-v |
--verbose |
详细输出 | ansible, ansible-playbook |
--limit |
--limit |
限制运行的主机范围 | ansible-playbook |
--tags |
--tags |
只执行带特定标签的任务 | ansible-playbook |
--extra-vars |
--extra-vars |
传递外部变量 | ansible-playbook |
--ask-vault-pass |
--ask-vault-pass |
交互式输入 Vault 密码 | ansible-playbook |
实战示例
准备工作:
-
配置好 SSH 免密登录到你的远程服务器。
-
在
/etc/ansible/hosts中定义你的主机,[webservers] 192.168.1.10 192.168.1.11 [dbserver] 192.168.1.20
示例 1:使用 Ad-hoc 命令
-
检查所有 Web 服务器的连通性:
ansible webservers -m ping
输出类似:
168.1.10 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } -
在所有 Web 服务器上安装 Nginx:
ansible webservers -m yum -a 'name=nginx state=present'
-
启动 Nginx 服务并设置开机自启(使用
become):ansible webservers -m systemd -a 'name=nginx state=started enabled=yes' -b
-
安全地检查 Nginx 配置文件是否会报错(使用
check模式):ansible webservers -m command -a 'nginx -t' -C -b
示例 2:使用 Playbook
创建一个名为 deploy_app.yml 的 Playbook:
---
- name: Deploy a simple web application
hosts: webservers
become: yes
tasks:
- name: Install Apache (httpd)
yum:
name: httpd
state: present
- name: Start Apache service
systemd:
name: httpd
state: started
enabled: yes
- name: Copy a simple index.html
copy:
content: "<h1>Hello from Ansible!</h1>"
dest: /var/www/html/index.html
- name: Open port 80 in firewall
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
-
执行 Playbook:
ansible-playbook deploy_app.yml
-
只执行 "install" 和 "copy" 标签的任务: 假设我们给任务加上标签:
- name: Install Apache (httpd) tags: install ... - name: Copy a simple index.html tags: install, content ...
执行命令:
ansible-playbook deploy_app.yml --tags install
-
使用变量和限制:
# 只在 192.168.1.10 上执行,并传入一个变量 ansible-playbook deploy_app.yml --limit 192.168.1.10 --extra-vars "app_version=1.2"
总结与最佳实践
- 从 Ad-hoc 开始:对于简单的、一次性的任务,
ansible命令是你的好朋友。 - 拥抱 Playbook:对于复杂的、需要重复执行的流程,务必使用
ansible-playbook,它更具可读性、可维护性和可复用性。 - 善用
--check和--diff:在生产环境执行任何操作前,先用检查模式跑一遍,确认无误后再正式执行,这是 Ansible 的安全网。 - 使用 Inventory:始终使用 Inventory 文件来管理你的主机,避免在命令中硬编码 IP 地址。
- 模块化思维:思考你要“做什么”,而不是“怎么做”,你想“安装一个包”,就应该用
yum或apt模块,而不是command模块执行yum install,这样你的代码更具通用性。 - 保护敏感信息:永远不要在 Playbook 或变量文件中明文写入密码、密钥,使用
ansible-vault来加密这些敏感信息。 - 善用标签:为 Playbook 中的任务打上清晰的标签(如
install,configure,deploy),这能极大地提高日常维护和排错的效率。 - 利用详细输出:当命令或 Playbook 没有按预期工作时,使用
-vvv来获取最详细的日志信息,这是调试的关键。
通过掌握这些核心命令和参数,你就可以高效地利用 Ansible 来管理你的 IT 基础设施和应用了。
