如何使用Ansible:参考指南
介绍
Ansible 是一个现代化的配置管理工具,它有助于设置和维护远程服务器的任务。
这个备忘单风格的指南提供了使用 Ansible 时常用的命令和实践的快速参考。 有关 Ansible 的概述以及如何安装和配置它,请查看我们关于 如何在 Ubuntu 20.04 上安装和配置 Ansible 的指南。
如何使用本指南:
- 本指南采用备忘单格式,带有独立的命令行片段。
- 跳转到与您尝试完成的任务相关的任何部分。
- 当您在本指南的命令中看到
highlighted text
时,请记住,此文本应指 您自己的 清单中的主机、用户名和 IP 地址。
Ansible 词汇表
本指南中主要使用以下 Ansible 特定术语:
- Control Machine / Node:安装和配置 Ansible 以在节点上连接和执行命令的系统。
- Node:由 Ansible 控制的服务器。
- Inventory File:包含有关 Ansible 控件的服务器信息的文件,通常位于
/etc/ansible/hosts
。 - Playbook:包含一系列要在远程服务器上执行的任务的文件。
- Role:与安装 Web 服务器等目标相关的剧本和其他文件的集合。
- Play:完整的 Ansible 运行。 play 可以有多个 playbook 和角色,包含在作为入口点的单个 playbook 中。
如果您想在实践中使用这些命令的示例,请参阅我们关于 如何在 Ubuntu 20.04 上使用 Ansible 自动化初始服务器设置的指南。 您至少需要一台远程服务器才能用作节点。
测试与节点的连接
要测试 Ansible 是否能够在您的节点上连接和运行命令和 playbook,您可以使用以下命令:
ansible all -m ping
除了测试 Ansible 是否能够在远程服务器上运行 Python 脚本之外,ping
模块将测试您是否具有连接到清单文件中定义的节点的有效凭据。 pong 回复意味着 Ansible 已准备好在该节点上运行命令和剧本。
以不同用户身份连接
默认情况下,Ansible 会尝试使用其对应的 SSH 密钥对以您当前的系统用户身份连接到节点。 要以其他用户身份连接,请在命令后面附加 -u
标志和预期用户的名称:
ansible all -m ping -u sammy
ansible-playbook
也一样:
ansible-playbook myplaybook.yml -u sammy
使用自定义 SSH 密钥
如果您使用自定义 SSH 密钥连接到远程服务器,您可以在执行时使用 --private-key
选项提供它:
ansible all -m ping --private-key=~/.ssh/custom_id
此选项对 ansible-playbook
也有效:
ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id
使用基于密码的身份验证
如果您需要使用 基于密码的身份验证 来连接到节点,则需要将选项 --ask-pass
附加到您的 Ansible 命令中。
这将使 Ansible 提示您输入您尝试连接的远程服务器上的用户密码:
ansible all -m ping --ask-pass
此选项对 ansible-playbook
也有效:
ansible-playbook myplaybook.yml --ask-pass
提供 sudo
密码
如果远程用户需要提供密码才能运行 sudo
命令,您可以在 Ansible 命令中包含选项 --ask-become-pass
。 这将提示您提供远程用户 sudo 密码:
ansible all -m ping --ask-become-pass
此选项对 ansible-playbook
也有效:
ansible-playbook myplaybook.yml --ask-become-pass
使用自定义库存文件
默认清单文件通常位于 /etc/ansible/hosts
,但您也可以在运行 Ansible 命令和 playbook 时使用 -i
选项指向自定义清单文件。 Ansible 还支持 库存脚本 用于构建动态库存文件,当您的库存波动时,服务器会经常被创建和销毁。 自定义清单文件对于设置可以包含在版本控制系统(例如 Git)中的每个项目的清单很有用:
ansible all -m ping -i my_custom_inventory
相同的选项对 ansible-playbook
有效:
ansible-playbook myplaybook.yml -i my_custom_inventory
运行 ad-hoc 命令
要在节点上执行命令,请使用 -a
选项,后跟要运行的命令,用引号括起来。
这将在清单中的 all 节点上执行 uname -a
:
ansible all -a "uname -a"
也可以使用选项 -m
运行 Ansible 模块。 以下命令将从您的库存中将包 vim
安装到 server1
上:
ansible server1 -m apt -a "name=vim"
在对节点进行更改之前,您可以进行 试运行 以预测服务器将如何受到您的命令的影响。 这可以通过包含 --check
选项来完成:
ansible server1 -m apt -a "name=vim" --check
运行剧本
要运行剧本并执行其中定义的所有任务,请使用 ansible-playbook
命令:
ansible-playbook myplaybook.yml
要覆盖 playbook 中的默认 hosts
选项并将执行限制在某个组或主机,请在命令中包含选项 -l
:
ansible-playbook -l server1 myplaybook.yml
获取有关播放的信息
选项 --list-tasks
用于列出所有将由 play 执行的任务,而无需对远程服务器进行任何更改:
ansible-playbook myplaybook.yml --list-tasks
同样,可以列出所有受播放影响的主机,而无需在远程服务器上运行任何任务:
ansible-playbook myplaybook.yml --list-hosts
您可以使用 tags 来限制播放的执行。 要列出剧本中所有可用的标签,请使用选项 --list-tags
:
ansible-playbook myplaybook.yml --list-tags
控制剧本执行
您可以使用选项 --start-at-task
为您的剧本定义一个新的入口点。 Ansible 然后将跳过指定任务之前的任何内容,从该点开始执行剩余的播放。 此选项需要有效的 任务名称 作为参数:
ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"
要仅执行与特定标签关联的任务,您可以使用选项 --tags
。 例如,如果您只想执行标记为 nginx
或 mysql
的任务,您可以使用:
ansible-playbook myplaybook.yml --tags=mysql,nginx
如果要跳过特定标签下的所有任务,请使用 --skip-tags
。 以下命令将执行 myplaybook.yml
,跳过所有标记为 mysql
的任务:
ansible-playbook myplaybook.yml --skip-tags=mysql
使用 Ansible Vault 存储敏感数据
如果您的 Ansible playbook 处理密码、API 密钥和凭据等敏感数据,则使用加密机制确保这些数据的安全非常重要。 Ansible 提供 ansible-vault
来加密文件和变量。
尽管可以加密任何 Ansible 数据文件以及二进制文件,但更常见的是使用 ansible-vault
来加密包含敏感数据的 变量文件。 使用此工具加密文件后,您只能通过提供首次加密文件时定义的相关密码来执行、编辑或查看其内容。
创建新的加密文件
您可以使用以下命令创建一个新的加密 Ansible 文件:
ansible-vault create credentials.yml
该命令将执行以下操作:
- 首先,它会提示您输入新密码。 每当您访问文件内容时,您都需要提供此密码,无论是用于编辑、查看还是仅使用这些值运行 playbook 或命令。
- 接下来,它将打开您的默认命令行编辑器,以便您可以使用所需内容填充文件。
- 最后,当您完成编辑后,
ansible-vault
会将文件保存为加密数据。
加密现有的 Ansible 文件
要加密现有的 Ansible 文件,可以使用以下语法:
ansible-vault encrypt credentials.yml
这将提示您输入密码,每当您访问文件 credentials.yml
时都需要输入该密码。
查看加密文件的内容
如果要查看之前使用 ansible-vault
加密的文件的内容并且不需要更改其内容,可以使用:
ansible-vault view credentials.yml
这将提示您提供首次使用 ansible-vault
加密文件时选择的密码。
编辑加密文件
要编辑之前使用 Ansible Vault 加密的文件的内容,请运行:
ansible-vault edit credentials.yml
这将提示您提供首次使用 ansible-vault
加密文件 credentials.yml
时选择的密码。 密码验证后,您的默认命令行编辑器将打开文件的未加密内容,允许您进行更改。 完成后,您可以照常保存和关闭文件,更新的内容将保存为加密数据。
解密加密文件
如果您希望将以前使用 ansible-vault
加密的文件永久还原为其未加密版本,您可以使用以下语法执行此操作:
ansible-vault decrypt credentials.yml
这将提示您提供第一次使用 ansible-vault
加密文件 credentials.yml
时使用的相同密码。 密码验证后,文件内容将作为未加密数据保存到磁盘。
使用多个 Vault 密码
Ansible 支持按不同保管库 ID 分组的多个保管库密码。 如果您想为不同的环境(例如开发、测试和生产环境)使用专用的保管库密码,这将非常有用。
要使用自定义保管库 ID 创建新的加密文件,请包括 --vault-id
选项以及 标签 和 ansible-vault
可以找到该保管库密码的位置。 标签可以是任何标识符,位置可以是 prompt
,这意味着该命令应提示您输入密码,或密码文件的有效路径。
ansible-vault create --vault-id dev@prompt credentials_dev.yml
这将创建一个名为 dev 的新保管库 ID,它使用 prompt
作为密码源。 通过将此方法与组变量文件相结合,您将能够为每个应用程序环境拥有单独的 ansible 保险库:
ansible-vault create --vault-id prod@prompt credentials_prod.yml
我们使用 dev 和 prod 作为 Vault ID 来演示如何为每个环境创建单独的 Vault,但您可以根据需要创建任意数量的 Vault,并且可以使用您的任何标识符选择作为保管库 ID。
现在要查看、编辑或解密这些文件,您需要提供相同的保管库 ID 和密码源以及 ansible-vault
命令:
ansible-vault edit credentials_dev.yml --vault-id dev@prompt
使用密码文件
如果您需要使用第三方工具通过 Ansible 自动配置服务器的过程,您将需要一种方法来提供保管库密码而不会被提示输入。 您可以通过使用 密码文件 和 ansible-vault
来做到这一点。
密码文件可以是纯文本文件或可执行脚本。 如果文件是可执行脚本,则此脚本生成的输出将用作保管库密码。 否则,文件的原始内容将用作保管库密码。
要将密码文件与 ansible-vault
一起使用,您需要在运行任何 Vault 命令时提供密码文件的路径:
ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml
只要输入的密码相同,Ansible 不会区分使用 prompt
加密的内容或密码文件作为密码源的内容。 实际上,这意味着可以使用 prompt
加密文件,然后使用密码文件存储与 prompt
方法使用的相同密码。 反之亦然:您可以使用密码文件加密内容,然后使用 prompt
方法,在 Ansible 提示时提供相同的密码。
为了提高灵活性和安全性,您可以使用 Python 脚本从其他来源获取密码,而不是将您的保管库密码存储在纯文本文件中。 官方 Ansible 存储库包含 一些 Vault 脚本示例 ,您可以在创建适合项目特定需求的自定义脚本时参考这些示例。
运行通过 Ansible Vault 加密数据的剧本
每当您运行使用先前通过 ansible-vault
加密的数据的 playbook 时,您需要向 playbook 命令提供保管库密码。
如果您在加密本 playbook 中使用的数据时使用了默认选项和 prompt
密码源,则可以使用选项 --ask-vault-pass
让 Ansible 提示您输入密码:
ansible-playbook myplaybook.yml --ask-vault-pass
如果您使用密码文件而不是提示输入密码,则应使用选项 --vault-password-file
代替:
ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py
如果您使用在保管库 ID 下加密的数据,则需要提供与首次加密数据时相同的保管库 ID 和密码源:
ansible-playbook myplaybook.yml --vault-id dev@prompt
如果使用带有您的保管库 ID 的密码文件,您应该提供标签,后跟密码文件的完整路径作为密码源:
ansible-playbook myplaybook.yml --vault-id dev@vault_password.py
如果您的游戏使用多个 Vault,您应该为每个 Vault 提供一个 --vault-id
参数,没有特定的顺序:
ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt
调试
如果您在执行 Ansible 命令和 playbook 时遇到错误,最好增加输出详细程度以获取有关问题的更多信息。 您可以通过在命令中包含 -v
选项来做到这一点:
ansible-playbook myplaybook.yml -v
如果您需要更多详细信息,可以使用 -vvv
,这将增加输出的详细程度。 如果您无法通过 Ansible 连接到远程节点,请使用 -vvvv
获取连接调试信息:
ansible-playbook myplaybook.yml -vvvv
结论
本指南涵盖了您在配置服务器时可能使用的一些最常见的 Ansible 命令,例如如何在节点上执行远程命令以及如何使用各种自定义设置运行 playbook。
您可能会发现其他命令变体和标志对您的 Ansible 工作流程很有用。 要获得所有可用选项的概览,您可以使用 help 命令:
ansible --help
如果您想更全面地了解 Ansible 及其所有可用的命令和功能,请参阅 官方 Ansible 文档。
如果您想查看 Ansible 的另一个实际示例,请查看我们关于 如何使用 Ansible 在 Ubuntu 20.04 上安装和设置 Docker 的指南。