菜鸟科技网

Ansible命令有哪些核心用法与参数?

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

Ansible 命令概览

Ansible 的命令通常遵循一个基本模式:

Ansible命令有哪些核心用法与参数?-图1
(图片来源网络,侵删)
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

参数详解:

Ansible命令有哪些核心用法与参数?-图2
(图片来源网络,侵删)
  • <host-pattern>:指定要操作的主机或主机组。

    • all:所有在 Inventory 中定义的主机。
    • webservers:Inventory 文件中名为 webservers 的主机组。
    • webservers:dbservers:同时操作 webserversdbservers 两个组。
    • db_server01:操作单个主机。
    • webservers:!atlanta:操作 webservers 组,但排除 atlanta 子组中的主机。
    • webservers:&staging:操作同时属于 webserversstaging 组的主机。
  • -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:传递给模块的参数,通常是一个由空格分隔的键值对列表,用单引号括起来。

    Ansible命令有哪些核心用法与参数?-图3
    (图片来源网络,侵删)
  • --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 来只执行这两个任务。
  • --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

实战示例

准备工作:

  1. 配置好 SSH 免密登录到你的远程服务器。

  2. /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"

总结与最佳实践

  1. 从 Ad-hoc 开始:对于简单的、一次性的任务,ansible 命令是你的好朋友。
  2. 拥抱 Playbook:对于复杂的、需要重复执行的流程,务必使用 ansible-playbook,它更具可读性、可维护性和可复用性。
  3. 善用 --check--diff:在生产环境执行任何操作前,先用检查模式跑一遍,确认无误后再正式执行,这是 Ansible 的安全网。
  4. 使用 Inventory:始终使用 Inventory 文件来管理你的主机,避免在命令中硬编码 IP 地址。
  5. 模块化思维:思考你要“做什么”,而不是“怎么做”,你想“安装一个包”,就应该用 yumapt 模块,而不是 command 模块执行 yum install,这样你的代码更具通用性。
  6. 保护敏感信息永远不要在 Playbook 或变量文件中明文写入密码、密钥,使用 ansible-vault 来加密这些敏感信息。
  7. 善用标签:为 Playbook 中的任务打上清晰的标签(如 install, configure, deploy),这能极大地提高日常维护和排错的效率。
  8. 利用详细输出:当命令或 Playbook 没有按预期工作时,使用 -vvv 来获取最详细的日志信息,这是调试的关键。

通过掌握这些核心命令和参数,你就可以高效地利用 Ansible 来管理你的 IT 基础设施和应用了。

分享:
扫描分享到社交APP
上一篇
下一篇