介绍
Ansible是一个现代化的配置管理工具,可简化远程服务器的设置和维护。
此 Cheat Sheet 风格指南提供了常用在 Ansible 工作时的命令和做法的快速参考。 有关 Ansible 的概述以及如何安装和配置,请参阅我们在 Ubuntu 20.04 上如何安装和配置 Ansible 的指南(https://andsky.com/tech/tutorials/how-to-install-and-configure-ansible-on-ubuntu-20-04)。
** 如何使用此指南:**
- 此指南是 cheat sheet 格式,包含自含命令行片段
- 跳到任何与您试图完成任务相关的部分
- 当您在本指南的命令中看到
突出文本
时,请记住,此文本应该指向 your own inventory 的主机、用户名和 IP 地址
可信的词典( )
以下 Ansible 特定的术语在本指南中被广泛使用:
- Control Machine / Node:一个系统,其中Ansible安装并配置为连接和执行节点上的命令
- Node:由Ansible控制的服务器
- Inventory File:包含关于服务器Ansible控制的信息的文件,通常位于
/etc/ansible/hosts
- Playbook:包含一系列任务在远程服务器上执行的文件。
如果您想在实践中看到这些命令的例子,请参阅我们的指南 如何在Ubuntu 20.04上使用Ansible来自动化初始服务器设置。
测试连接到节点
要测试 Ansible 是否能够在节点上连接和运行命令和播放簿,您可以使用以下命令:
1ansible all -m ping
该ping
模块将测试您是否有有效的凭证连接到库存文件中定义的节点,以及测试Ansible是否能够在远程服务器上运行Python脚本。
作为不同的用户连接
默认情况下,Ansible 会尝试作为当前系统用户连接到节点,使用相应的 SSH 键对。
1ansible all -m ping -u sammy
同样适用于ansible-playbook
:
1ansible-playbook myplaybook.yml -u sammy
使用自定义 SSH 密钥
如果您正在使用自定义 SSH 密钥连接到远程服务器,则可以在执行时提供--private-key
选项:
1ansible all -m ping --private-key=~/.ssh/custom_id
此选项也适用于ansible-playbook
:
1ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id
使用基于密码的身份验证
如果您需要使用 password-based authentication 才能连接到节点,则需要将 `--ask-pass' 选项附加到您的 Ansible 命令中。
这样可以让 Ansible 提示您在您试图连接的远程服务器上的用户密码:
1ansible all -m ping --ask-pass
此选项也适用于ansible-playbook
:
1ansible-playbook myplaybook.yml --ask-pass
输入sudo
密码
如果远程用户需要提供密码才能运行sudo
命令,您可以将--ask-become-pass
选项添加到您的 Ansible命令中。
1ansible all -m ping --ask-become-pass
此选项也适用于ansible-playbook
:
1ansible-playbook myplaybook.yml --ask-become-pass
使用自定义库存文件
默认库存文件通常位于/etc/ansible/hosts
,但您也可以使用-i
选项在运行 Ansible 命令和播放书时指向自定义库存文件。 Ansible 还支持构建动态库存文件的 _inventory scripts,用于库存波动时,服务器经常被创建和破坏。
1ansible all -m ping -i my_custom_inventory
相同的选项适用于ansible-playbook
:
1ansible-playbook myplaybook.yml -i my_custom_inventory
运行 ad-hoc 命令
要在节点上执行命令,请在引用中使用-a
选项,然后是要运行的命令。
这将对您的库存中的所有节点执行uname -a
:
1ansible all -a "uname -a"
也可以使用-m
选项运行 Ansible 模块,以下命令将从库存中安装包vim
到server1
:
1ansible server1 -m apt -a "name=vim"
在对节点进行更改之前,您可以进行 dry run 来预测您的命令将如何影响服务器。
1ansible server1 -m apt -a "name=vim" --check
运行PlayBooks
要运行播放簿并执行其内定义的所有任务,请使用ansible-playbook
命令:
1ansible-playbook myplaybook.yml
若要在播放簿中重写默认主机
选项,并将执行限制在特定组或主机上,请在您的命令中包括选项-l
:
1ansible-playbook -l server1 myplaybook.yml
获取有关游戏的信息
选项 --list-tasks
用于列出所有任务,而不会对远程服务器进行任何更改:
1ansible-playbook myplaybook.yml --list-tasks
同样,可以列出所有会受到游戏影响的主机,而不会在远程服务器上运行任何任务:
1ansible-playbook myplaybook.yml --list-hosts
您可以使用 tags 来限制演奏的执行. 若要列出演奏中可用的所有标签,请使用 --list-tags
选项:
1ansible-playbook myplaybook.yml --list-tags
控制 Playbook 執行
您可以使用 --start-at-task
选项来定义播放簿的新入口点,然后 Ansible 将跳过指定的任务之前的任何内容,从此执行剩余的播放。
1ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"
若要只執行與特定標籤相關的任務,可以使用「--標籤」選項,例如,如果您只想執行標記為「nginx」或「mysql」的任務,您可以使用:
1ansible-playbook myplaybook.yml --tags=mysql,nginx
如果您想跳过特定标签下的所有任务,请使用 --skip-tags. 下面的命令将执行
myplaybook.yml',跳过所有标记为 `mysql 的任务:
1ansible-playbook myplaybook.yml --skip-tags=mysql
使用 Ansible Vault 存储敏感数据
如果您的 Ansible 播放簿处理密码、API 密钥和凭证等敏感数据,则使用加密机制来保护这些数据很重要。
虽然可以加密任何 Ansible 数据文件以及二进制文件,但使用ansible-vault
来加密包含敏感数据的 variable files 更常见。
创建一个新的加密文件
您可以创建一个新的加密的 Ansible 文件:
1ansible-vault create credentials.yml
这个命令将执行以下操作:
- 首先,它会提示您输入一个新的密码. 您需要每次访问文件内容时提供此密码,无论是编辑、查看还是仅仅运行使用这些值的播放簿或命令
- 接下来,它将打开默认的命令行编辑器,以便您可以填充所需的内容
- 最后,当您完成编辑时,
ansible-vault
将将该文件保存为加密数据
加密现有 Ansible 文件
要加密现有 Ansible 文件,您可以使用以下语法:
1ansible-vault encrypt credentials.yml
这会提示你一个密码,你需要输入每当你访问文件 credentials.yml
。
查看加密文件的内容
如果您想查看以前用ansible-vault
加密的文件的内容,而不需要更改其内容,您可以使用:
1ansible-vault view credentials.yml
这将提示您提供您在首次使用ansible-vault
加密文件时选择的密码。
编辑加密文件
若要编辑以前用 Ansible Vault 加密的文件的内容,请运行:
1ansible-vault edit credentials.yml
这将提示您在首次使用ansible-vault
加密credentials.yml
文件时选择的密码。密码验证后,默认命令行编辑器将打开文件的未加密内容,允许您进行更改。完成后,您可以像正常情况下保存和关闭文件,更新内容将保存为加密数据。
解密加密文件
如果您希望永久地将以前用ansible-vault
加密的文件恢复到未加密的版本,则可以使用以下语法:
1ansible-vault decrypt credentials.yml
这将提示您在首次使用ansible-vault
加密credentials.yml
文件时提供相同的密码。
使用多個 Vault 密碼
Ansible 支持由不同的保险箱 ID 组合的多个保险箱密码,如果您想要为不同的环境(如开发、测试和生产环境)提供专用保险箱密码,则非常有用。
若要使用自定义保险箱 ID 创建新的加密文件,请包括 --vault-id
选项以及 label 和 `ansible-vault' 可以找到该保险箱的密码的位置。
1ansible-vault create --vault-id dev@prompt credentials_dev.yml
通过将此方法与组变量文件相结合,您将能够为每个应用环境拥有单独的 ansible vaults:
1ansible-vault create --vault-id prod@prompt credentials_prod.yml
我们使用 dev 和 prod 作为保险箱 ID 来展示您如何在每个环境中创建单独的保险箱,但您可以创建尽可能多的保险箱,您可以使用您选择的任何标识符作为保险箱 ID。
现在,要查看、编辑或解密这些文件,您需要提供相同的保险箱 ID 和密码源,以及ansible-vault
命令:
1ansible-vault edit credentials_dev.yml --vault-id dev@prompt
使用密码文件
如果您需要使用第三方工具来自动化使用 Ansible 提供服务器的过程,则需要一种方法来提供保险箱密码而不会被要求使用。
密码文件可以是简单的文本文件或可执行的脚本。如果该文件是可执行的脚本,则该脚本产生的输出将被用作保险箱密码,否则文件的原始内容将被用作保险箱密码。
要使用ansible-vault
的密码文件,您需要在运行任何密码命令时提供密码文件的路径:
1ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml
Ansible不区分使用prompt
加密的内容或作为密码源的密码文件,只要输入密码是相同的,这意味着使用prompt
加密文件,然后使用密码文件来存储与prompt
方法相同的密码是正常的。
为了更大的灵活性和安全性,而不是将保险箱密码存储在一个简单的文本文件中,您可以使用Python脚本从其他来源获取密码。
使用通过 Ansible Vault 加密的数据运行 Playbook
每当您运行使用以前通过ansible-vault
加密的数据的播放簿时,您将需要为播放簿命令提供保险箱密码。
如果您在加密本图书中使用的数据时使用了默认选项和提示
密码源,则可以使用--ask-vault-pass
选项让 Ansible 提示您获取密码:
1ansible-playbook myplaybook.yml --ask-vault-pass
如果您使用了密码文件,而不是提示密码,您应该使用选项 --vault-password-file
:
1ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py
如果您正在使用在保险箱 ID 中加密的数据,则需要提供您第一次加密数据时使用的相同保险箱 ID 和密码源:
1ansible-playbook myplaybook.yml --vault-id dev@prompt
如果您使用密码文件与保险箱 ID,您应该提供密码源的标签,然后是密码文件的完整路径:
1ansible-playbook myplaybook.yml --vault-id dev@vault_password.py
如果你的游戏使用多个柜子,你应该为每个柜子提供一个--vault-id
参数,而不是以特定顺序:
1ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt
调试
如果在执行 Ansible 命令和播放簿时遇到错误,则可以增加输出语音性以获取有关问题的更多信息。
1ansible-playbook myplaybook.yml -v
如果您需要更多的细节,您可以使用-vvv
,这将增加输出的语音性. 如果您无法通过Ansible连接到远程节点,请使用-vvvv
获取连接调试信息:
1ansible-playbook myplaybook.yml -vvvv
结论
本指南涵盖了您在提供服务器时可能使用的一些最常见的 Ansible 命令,例如如何在节点上执行远程命令以及如何使用各种自定义设置运行播放簿。
还有其他命令变异和旗帜,您可能会发现对您的 Ansible 工作流有用. 若要查看所有可用的选项,您可以使用 help 命令:
1ansible --help
如果您想要对Ansible及其所有可用的命令和功能的更全面的观点,请参阅 官方Ansible文档。
如果您想看到另一个实用范例的Ansible,请参阅我们的指南在 如何使用Ansible在Ubuntu 20.04上安装和设置Docker。