安塞贝尔备忘录

引言

是一个现代的组态管理 / 服务器工具,可以方便地设置和维护远程服务器。

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

如何使用本指南:

  • 本指南采用备忘单格式,具有自包含的命令行代码段。
  • 跳转到任何与您要完成的任务相关的部分。
  • 当您在本指南的命令中看到突出显示的文本时,请记住,这些文本应该引用您自己库存中的主机、用户名和 IP 地址。

安塞布尔词汇

本指南主要使用下列安塞词汇:

  • 控制机器 / 节点: 安装 Ansible 并配置为在节点上连接和执行命令的系统。
  • 节点: 由安塞波控制的服务器。
  • 库存文件: 一个包含服务器信息的文件,Ansible 控件,通常位于 / etc / anable / hosts。
  • Playbook: 包含一系列将在远程服务器上执行的任务的文件。
  • 角色: 一组剧本和其他与目标相关的文件,比如安装网络服务器。
  • 剧目: 一个完整的安塞比赛。 一部戏剧可以有多个剧本和角色,包括作为切入点的单个剧本。

如果你想在一个可用的安塞波操作手册上练习本指南中使用的命令,你可以使用我们在 Ubuntu 18.04上使用安塞波自动化初始服务器设置的指南中的这个剧本。 至少需要一个远程服务器作为节点。

测试节点连接性

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

  • ansible all -m ping

除了测试 Ansible 是否能够在远程服务器上运行 Python 脚本之外,ping 模块还将测试您是否具有连接到库存文件中定义的节点的有效凭据。 Pong 回复意味着 Ansible 已经准备好在该节点上运行命令和剧本。

作为不同用户进行连接

默认情况下,Ansible 尝试使用相应的 SSH 密钥对作为当前系统用户连接到节点。 要作为不同的用户连接,在命令后面附加-u 标志和目标用户的名称:

  • ansible all -m ping -u sammy

同样的道理也适用于安塞剧本:

  • ansible-playbook myplaybook.yml -u sammy

使用自定义 SSH 密钥

如果使用自定义 SSH 密钥连接到远程服务器,可以在执行时使用 -- private-key 选项提供该密钥:

  • ansible all -m ping --private-key=~/.ssh/custom_id

这个选择对于安塞剧本也是有效的:

  • ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id

使用基于密码的认证

如果您需要使用基于密码的身份验证来连接到节点,那么您需要将选项 ask-pass 附加到您的 Ansible 命令。

这将使 Ansible 提示您输入您正在尝试连接的远程服务器上的用户的密码:

  • ansible all -m ping --ask-pass

这个选择对于安塞剧本也是有效的:

  • ansible-playbook myplaybook.yml --ask-pass

提供 sudo 密码

如果远程用户需要提供密码才能运行 sudo 命令,则可以包含选项 -- ask-become-pass to your Ansible 命令。 这将提示您提供远程用户 sudo 密码:

  • ansible all -m ping --ask-become-pass

这个选项也适用于安塞剧本:

  • ansible-playbook myplaybook.yml --ask-become-pass

使用自定义库存文件

默认的库存文件通常位于 / etc / Ansible / hosts,但是在运行 Ansible 命令和剧本时,您也可以使用 -i 选项指向自定义库存文件。 这对于建立每个项目的库存非常有用,这些库存可以包含在版本控制系统中,比如 Git:

  • ansible all -m ping -i my_custom_inventory

同样的选择也适用于内部剧本:

  • ansible-playbook myplaybook.yml -i my_custom_inventory

使用动态库存文件

支持构建动态库存文件的库存脚本。 这是有用的,如果您的库存波动,服务器被创建和销毁往往。

你可以在官方的 ansenablegithub 库中找到许多开源库存脚本。 在将所需的脚本下载到您的 Ansible 控制机器并设置任何所需的信息(如 API 凭证)之后,您可以使用可执行文件作为自定义库存,并使用任何支持该选项的 Ansible 命令。

下面的命令使用安塞的 DigitalOcean 库存脚本,通过 ping 命令检查所有当前运行的服务器的连接性:

  • ansible all -m ping -i digital_ocean.py

关于如何使用动态库存文件的更多细节,请参考官方的安塞贝文件。

运行特别命令

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

这将在库存中的所有节点上执行 uname-a:

  • ansible all -a "uname -a"

它也可以运行选项 -m 的安塞模块。 下面的命令可以从你的目录中在 server1上安装 vim 包:

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

在对节点进行更改之前,可以进行一次演练,以预测命令将如何影响服务器。 这可以通过包含 -- check 选项来实现:

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

运行剧本

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

  • ansible-playbook myplaybook.yml

要覆盖 playbook 中的默认主机选项并将执行限制在某个组或主机上,请在命令中包含 option-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 的执行

您可以使用“从任务开始”选项为您的剧本定义一个新的入口点。 然后,安塞布将跳过任何在指定任务之前出现的内容,从那一点开始执行游戏的剩余部分。 这个选项需要一个有效的任务名作为参数:

  • ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"

若要只执行与特定标记关联的任务,可以使用 option -- tags。 例如,如果你只想执行标记为 nginx 或 mysql 的任务,你可以使用:

  • ansible-playbook myplaybook.yml --tags=mysql,nginx

如果希望跳过特定标记下的所有任务,请使用 -- skip-tags。 下面的命令将执行 myplaybook.yml,跳过标记为 mysql 的所有任务:

  • ansible-playbook myplaybook.yml --skip-tags=mysql

利用安塞库存储敏感数据

如果您的 Ansible 剧本处理敏感数据,如密码、 API 密钥和凭证,重要的是要使用加密机制来保证数据的安全。 安塞波提供了安塞库来加密文件和变量。

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

创建新的加密文件

你可以创建一个新的加密的安塞文件:

  • ansible-vault create credentials.yml

这个命令将执行以下操作:

  • 首先,它会提示您输入一个新的密码。 每当您访问文件内容时,您都需要提供这个密码,无论是用于编辑、查看,还是仅仅运行使用这些值的剧本或命令。
  • 接下来,它将打开默认的命令行编辑器,这样您就可以用所需的内容填充文件。
  • 最后,当你完成编辑,安塞库将保存文件作为加密数据。

对现有文件进行加密

要加密现有的安塞波文件,你可以使用以下语法:

  • ansible-vault encrypt credentials.yml

这将提示您输入一个密码,您在访问文件 credentials.yml 时需要输入这个密码。

查看加密文件的内容

如果您想查看以前使用 ansible-vault 加密的文件的内容,并且不需要更改其内容,可以使用以下命令:

  • ansible-vault view credentials.yml

这将提示您提供您在第一次使用安塞库对文件进行加密时所选择的密码。

编辑加密文件

要编辑先前使用安塞库加密的文件内容,请运行:

  • ansible-vault edit credentials.yml

这将提示您提供第一次使用 ansible-vault 对文件 credentials.yml 进行加密时选择的密码。 在密码验证之后,您的默认命令行编辑器将以文件的未加密内容打开,从而允许您进行更改。 完成后,您可以像通常一样保存和关闭文件,更新后的内容将被保存为加密数据。

解密加密文件

如果你希望将一个以前用安塞库加密过的文件永久恢复为未加密版本,你可以使用以下语法:

  • ansible-vault decrypt credentials.yml

这将提示您提供第一次使用 ansible-vault 对文件 credentials.yml 进行加密时使用的相同密码。 在密码验证之后,文件内容将作为未加密数据保存到磁盘中。

使用多重保险库密码

安塞贝利支持按不同的保险库 id 分组的多个保险库密码。 如果您希望在不同的环境(如开发、测试和生产环境)中使用专用的保险库密码,这是非常有用的。

要使用自定义的保险库 ID 创建一个新的加密文件,需要包含 -- vault-ID 选项以及一个标签和安塞保险库可以找到该保险库密码的位置。 标签可以是任何标识符,位置可以是提示符,这意味着命令应该提示您输入密码,或者输入密码文件的有效路径。

  • ansible-vault create --vault-id dev@prompt credentials_dev.yml

这将创建一个名为 dev 的新保险库 ID,该 ID 使用提示作为密码源。 通过将这种方法与组变量文件相结合,您将能够为每个应用程序环境创建单独的可分解结果:

  • ansible-vault create --vault-id prod@prompt credentials_prod.yml

我们使用 dev 和 prod 作为保险库 ID 来演示如何在每个环境中创建单独的保险库,但是您可以创建任意多的保险库,并且可以使用所选择的任意标识符作为保险库 ID。

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

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

使用密码文件

如果您需要使用第三方工具自动化使用 Ansible 提供服务器的过程,那么您需要一种方法来提供密码而不需要提示。 你可以通过使用一个安塞库的密码文件来做到这一点。

密码文件可以是纯文本文件或可执行脚本。 如果文件是可执行脚本,则此脚本生成的输出将用作保险库密码。 否则,文件的原始内容将用作保险库密码。

要使用安塞保险库的密码文件,在运行任何保险库命令时需要提供密码文件的路径:

  • ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml

只要输入的密码是相同的,Ansible 不区分使用提示符加密的内容和使用密码文件作为密码源的内容。 实际上,这意味着可以使用提示对文件进行加密,然后使用密码文件存储与提示方法相同的密码。 反之亦然: 您可以使用密码文件对内容进行加密,然后使用提示方法,在 Ansible 提示时提供相同的密码。

为了扩展灵活性和安全性,您可以使用 Python 脚本从其他来源获取密码,而不是将密码存储在纯文本文件中。 官方的 Ansible 知识库包含一些 vault 脚本示例,您可以在创建适合您项目特定需求的自定义脚本时使用这些脚本作为参考。

利用安塞库加密数据运行 Playbook

无论何时运行一个使用先前通过安塞库加密的数据的 playbook,都需要向 playbook 命令提供库密码。

如果您在加密本剧本中使用的数据时使用了默认选项和提示密码源,您可以使用 ask-vault-pass 选项来提示您输入密码:

  • 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 命令和剧本时遇到错误,最好增加输出详细度,以获得更多有关问题的信息。 可以通过在命令中包含-v 选项来实现:

  • ansible-playbook myplaybook.yml -v

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

  • ansible-playbook myplaybook.yml -vvvv

总结

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

还有其他命令变体和标志,您可能会发现这些对您的安塞布工作流程有用。 要获得所有可用选项的概览,您可以使用 help 命令:

  • ansible --help

如果你想更全面地了解 Ansible 及其所有可用的命令和特性,请参考官方的 Ansible 文档。