如何使用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。 例如,如果您只想执行标记为 nginxmysql 的任务,您可以使用:

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

我们使用 devprod 作为 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 的指南。