如何使用Ansible:参考指南

Ansible是一种现代配置管理工具,可以简化设置和维护远程服务器的任务。 这个备忘单样式指南提供了使用Ansible时常用的命令和实践的快速参考。

Ansible备忘单

介绍

Ansible是一种现代配置管理工具,可以简化设置和维护远程服务器的任务。

这个备忘单样式指南提供了使用Ansible时常用的命令和实践的快速参考。 有关Ansible以及如何安装和配置它的概述,请查看我们的指南, 了解如何在Ubuntu 18.04上安装和配置Ansible

如何使用本指南:

  • 本指南采用备忘单格式,包含自包含的命令行代码段。
  • 跳转到与您要完成的任务相关的任何部分。
  • 当您在本指南的命令中看到highlighted text时,请记住,此文本应引用您自己的清单中的主机,用户名和IP地址。

Ansible词汇表

本指南主要使用以下Ansible特定术语:

  • 控制机器/节点 :安装Ansible并配置为在节点上连接和执行命令的系统。
  • 节点 :由Ansible控制的服务器。
  • 清单文件 :包含有关服务器Ansible控件的信息的文件,通常位于/etc/ansible/hosts
  • Playbook :包含要在远程服务器上执行的一系列任务的文件。
  • 角色 :与目标相关的剧本和其他文件的集合,例如安装Web服务器。
  • :完整的Ansible运行。 一个剧本可以有几个剧本和角色,包括作为入口点的单个剧本。

如果您想使用可用的Ansible playbook练习本指南中使用的命令,可以在Ubuntu 18.04上使用Ansible自动执行初始服务器设置指南中使用此剧本 您至少需要一个远程服务器才能用作节点。

测试与节点的连接

要测试Ansible是否能够在节点上连接和运行命令和playbooks,可以使用以下命令:

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命令和playbooks时使用-i选项指向自定义清单文件。 这对于设置可以包含在Git等版本控制系统中的每个项目库存非常有用:

ansible all -m ping -i my_custom_inventory

相同的选项对ansible-playbook有效:

ansible-playbook myplaybook.yml -i my_custom_inventory

使用动态库存文件

Ansible支持用于构建动态库存文件的库存脚本 如果您的库存波动,经常创建和销毁服务器,这将非常有用。

您可以在官方Ansible GitHub存储库中找到许多开源库存脚本 将所需脚本下载到Ansible控制计算机并设置任何所需信息(如API凭据)后,可以将可执行文件用作支持此选项的任何Ansible命令的自定义清单。

以下命令使用Ansible的DigitalOcean清单脚本ping命令来检查与所有当前活动服务器的连接:

ansible all -m ping -i digital_ocean.py

有关如何使用动态库存文件的更多详细信息,请参阅Ansible官方文档

运行ad-hoc命令

要在节点上执行任何命令,请在引号中使用-a选项,后跟要运行的命令。

这将在清单中的所有节点上执行uname -a

ansible all -a "uname -a"

也可以使用选项-m运行Ansible模块。 以下命令将从您的清单中在server1上安装软件包vim

ansible server1 -m apt -a "name=vim"

在对节点进行更改之前,您可以进行空运行以预测服务器将如何受到命令的影响。 这可以通过包含--check选项来完成:

ansible server1 -m apt -a "name=vim" --check

运行Playbooks

要运行playbook并执行其中定义的所有任务,请使用ansible-playbook命令:

ansible-playbook myplaybook.yml

要覆盖playbook中的default hosts选项并限制执行某个组或主机,请在命令中包含选项-l

ansible-playbook -l server1 myplaybook.yml

获取有关游戏的信息

选项--list-tasks用于列出游戏将执行的所有任务,而不对远程服务器进行任何更改:

ansible-playbook myplaybook.yml --list-tasks

同样,可以列出所有受播放影响的主机,而无需在远程服务器上运行任何任务:

ansible-playbook myplaybook.yml --list-hosts

您可以使用标签来限制播放的执行。 要列出播放中可用的所有标签,请使用选项--list-tags

ansible-playbook myplaybook.yml --list-tags

控制Playbook执行

您可以使用选项--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 ansible-vault来加密文件和变量。

尽管可以加密任何Ansible数据文件以及二进制文件,但使用ansible-vault加密包含敏感数据的变量文件更为常见。 使用此工具加密文件后,您只能通过提供首次加密文件时定义的相关密码来执行,编辑或查看其内容。

创建新的加密文件

您可以使用以下命令创建新的加密Ansible文件:

ansible-vault create credentials.yml

此命令将执行以下操作:

  • 首先,它会提示您输入新密码。 无论是用于编辑,查看还是仅使用这些值运行playbooks或命令,您都需要在访问文件内容时提供此密码。
  • 接下来,它将打开您的默认命令行编辑器,以便您可以使用所需的内容填充文件。
  • 最后,当您完成编辑后, 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作为保险库ID来演示如何为每个环境创建单独的保险库,但您可以根据需要创建任意数量的保险库,并且您可以使用您选择的任何标识符作为保险库ID。

现在,要查看,编辑或解密这些文件,您需要提供相同的保管库ID和密码源以及ansible-vault命令:

ansible-vault edit credentials_dev.yml --vault-id dev@prompt 

使用密码文件

如果您需要使用第三方工具自动化使用Ansible配置服务器的过程,则需要一种方法来提供保管库密码而不会提示它。 您可以通过使用带有ansible-vault密码文件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运行带有数据加密的Playbook

每当您运行使用先前通过ansible-vault加密的数据的剧本时,您都需要为您的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-id参数,无特定顺序:

ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt

调试

如果在执行Ansible命令和playbooks时遇到错误,最好增加输出详细程度以获取有关该问题的更多信息。 您可以通过在命令中包含-v选项来执行此操作:

ansible-playbook myplaybook.yml -v

如果您需要更多细节,可以使用-vvv ,这将增加输出的详细程度。 如果您无法通过Ansible连接到远程节点,请使用-vvvv获取连接调试信息:

ansible-playbook myplaybook.yml -vvvv

结论

本指南介绍了在配置服务器时可能使用的一些最常见的Ansible命令,例如如何在节点上执行远程命令以及如何使用各种自定义设置运行playbooks。

您可能会发现其他命令变体和标志对Ansible工作流程很有用。 要获得所有可用选项的概述,可以使用help命令:

ansible  --help

如果您想要更全面地查看Ansible及其所有可用命令和功能,请参阅Ansible官方文档