使用 Ansible:参考指南

介紹

Ansible是一款現代配置管理工具,可幫助設置和維護遠程服務器的任務。

這個速查表式指南提供了使用 Ansible 時常用的命令和實踐的快速參考。如需了解 Ansible 概述以及如何安裝和配置它,請參閱我們的指南:如何在 Ubuntu 20.04 上安裝和配置 Ansible

如何使用本指南:

  • 本指南以速查表格式提供自包含的命令行片段。
  • 跳至與您正在完成的任務相關的任何部分。
  • 當您在本指南的命令中看到突出顯示的文本時,請記住,這些文本應該是來自您自己清單的主機、用戶名和 IP 地址。

Ansible詞彙表

以下是在本指南中大部分使用的 Ansible 特定術語:

  • 控制機器/節點:安裝並配置 Ansible 以連接並在節點上執行命令的系統。
  • 節點:由 Ansible 控制的服務器。
  • 庫存文件:包含有關 Ansible 控制的伺服器信息的文件,通常位於 /etc/ansible/hosts
  • Playbook:包含要在遠程伺服器上執行的一系列任務的文件。
  • 角色:包含一組 Playbook 和其他與安裝 Web 伺服器等目標相關的文件。
  • Play:完整的 Ansible 執行。一個 play 可以有多個 Playbook 和角色,從作為入口點的單個 Playbook 包含。

如果您想了解這些命令在實踐中的示例,請參閱我們關於 如何使用 Ansible 自動化 Ubuntu 20.04 上的初始伺服器設置 的指南。您至少需要一台遠程伺服器作為節點。

測試與節點的連接

要測試 Ansible 是否能夠連接並在節點上運行命令和 Playbook,您可以使用以下命令:

  1. ansible all -m ping

ping 模組將測試您是否具有連接到庫存文件中定義的節點的有效憑據,以及測試 Ansible 是否能夠在遠程伺服器上運行 Python 腳本。一個 pong 回覆表示 Ansible 已準備好在該節點上運行命令和 Playbook。

以不同用户身份连接

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

  1. ansible all -m ping -u sammy

对于 ansible-playbook 也是如此:

  1. ansible-playbook myplaybook.yml -u sammy

使用自定义 SSH 密钥

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

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

此选项对 ansible-playbook 也适用:

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

使用基于密码的身份验证

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

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

  1. ansible all -m ping --ask-pass

這個選項對於ansible-playbook也是有效的:

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

提供sudo密碼

如果遠程用戶需要提供密碼才能運行sudo命令,您可以在Ansible命令中包含選項--ask-become-pass。這將提示您提供遠程用戶sudo密碼:

  1. ansible all -m ping --ask-become-pass

這個選項對於ansible-playbook也是有效的:

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

使用自定義清單文件

默認的清單文件通常位於/etc/ansible/hosts,但您也可以在運行Ansible命令和playbook時使用-i選項指向自定義清單文件。Ansible還支持清單腳本來構建動態清單文件,用於當您的清單波動時,伺服器經常創建和銷毀。自定義清單文件對於設置每個項目的清單非常有用,可以包含在版本控制系統(如Git)中:

  1. ansible all -m ping -i my_custom_inventory

對於ansible-playbook,同樣的選項也是有效的:

  1. ansible-playbook myplaybook.yml -i my_custom_inventory

執行 臨時 命令

要在節點上執行命令,請使用-a選項,後跟您要運行的命令,用引號括起來。

這將在您的清單中的所有節點上執行uname -a

  1. ansible all -a "uname -a"

還可以使用選項-m運行Ansible模塊。以下命令將在您的清單中的server1上安裝套件vim

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

在對節點進行更改之前,您可以進行試運行以預測您的命令將如何影響服務器。這可以通過包含選項--check來完成:

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

執行Playbooks

要運行一個Playbook並執行其中定義的所有任務,請使用ansible-playbook命令:

  1. ansible-playbook myplaybook.yml

要覆蓋Playbook中的默認hosts選項並將執行限制為特定組或主機,請在您的命令中包含選項-l

  1. ansible-playbook -l server1 myplaybook.yml

獲取有關戲劇的信息

選項--list-tasks用於列出將由戲劇執行的所有任務,而不對遠程服務器進行任何更改:

  1. ansible-playbook myplaybook.yml --list-tasks

同樣,可以列出將受戲劇影響的所有主機,而不在遠程服務器上運行任何任務:

  1. ansible-playbook myplaybook.yml --list-hosts

您可以使用標籤來限制戲劇的執行。要列出戲劇中可用的所有標籤,請使用選項--list-tags

  1. ansible-playbook myplaybook.yml --list-tags

控制劇本執行

您可以使用選項--start-at-task來定義劇本的新入口點。然後,Ansible將跳過指定任務之前的所有內容,從該點開始執行戲劇的其餘部分。此選項需要一個有效的任務名稱作為參數:

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

要僅執行與特定標籤相關的任務,您可以使用選項--tags。例如,如果您只想執行標記為nginxmysql的任務,您可以使用:

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

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

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

使用 Ansible Vault 存储敏感数据

如果您的 Ansible playbook 涉及诸如密码、API 密钥和凭据等敏感数据,通过使用加密机制来保护这些数据的安全至关重要。Ansible 提供了ansible-vault来加密文件和变量。

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

创建新的加密文件

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

  1. ansible-vault create credentials.yml

此命令将执行以下操作:

  • 首先,它會提示您輸入新密碼。每次訪問文件內容時,無論是編輯、查看還是僅使用這些值運行playbook或命令,您都需要提供此密碼。
  • 接下來,它將打開您的默認命令行編輯器,以便您將文件填充為所需內容。
  • 最後,當您編輯完成時,ansible-vault將文件保存為加密數據。

加密現有的 Ansible 文件

要加密現有的 Ansible 文件,您可以使用以下語法:

  1. ansible-vault encrypt credentials.yml

這將提示您輸入密碼,以便在訪問文件 credentials.yml 時使用。

查看加密文件的內容

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

  1. ansible-vault view credentials.yml

這將提示您提供首次使用 ansible-vault 加密文件時選擇的密碼。

編輯加密文件

要編輯之前使用 Ansible Vault 加密的文件內容,執行:

  1. ansible-vault edit credentials.yml

這將提示您提供首次使用 ansible-vault 加密 credentials.yml 文件時選擇的密碼。密碼驗證後,將使用您的默認命令行編輯器打開文件的未加密內容,讓您進行更改。完成後,您可以像平常一樣保存並關閉文件,更新後的內容將以加密數據的形式保存。

解密加密文件

如果您希望永久將之前使用 ansible-vault 加密的文件恢復為其未加密版本,可以使用以下語法:

  1. ansible-vault decrypt credentials.yml

這將提示您提供首次使用 ansible-vault 加密 credentials.yml 文件時使用的相同密碼。密碼驗證後,文件內容將保存到磁盤上作為未加密數據。

使用多個金庫密碼

Ansible支持按不同金庫ID分組的多個金庫密碼。如果您想為不同的環境(如開發、測試和生產環境)設置專用的金庫密碼,這將非常有用。

要使用自定義金庫ID創建新的加密文件,請在--vault-id選項中包括一個標籤ansible-vault可以找到該金庫密碼的位置。標籤可以是任何標識符,位置可以是prompt,表示該命令應提示您輸入密碼,或者是指向密碼文件的有效路徑。

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

這將創建一個名為dev的新金庫ID,該金庫使用prompt作為密碼來源。通過將此方法與組變量文件結合使用,您將能夠為每個應用程序環境設置單獨的ansible金庫:

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

我們使用devprod作為金庫ID,以演示如何按環境創建單獨的金庫,但您可以創建任意多個金庫,並且可以使用您選擇的任何標識符作為金庫ID。

現在,要查看、編輯或解密這些文件,您需要在ansible-vault命令中提供相同的金庫ID和密碼來源:

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

使用密碼檔案

如果您需要使用第三方工具自動配置伺服器並使用 Ansible,您需要一種方法來提供金鑰密碼,而不需要提示輸入。您可以使用 ansible-vault 來使用 密碼檔案

A password file can be a plain text file or an executable script. If the file is an executable script, the output produced by this script will be used as the vault password. Otherwise, the raw contents of the file will be used as vault password.

要使用 ansible-vault 來使用密碼檔案,您需要在執行任何金鑰命令時提供密碼檔案的路徑:

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

Ansible 不會對使用 prompt 或密碼檔案作為密碼來源加密的內容進行區分,只要輸入密碼相同即可。在實際操作中,這意味著可以使用 prompt 加密文件,然後稍後使用密碼檔案存儲與 prompt 方法相同的密碼。反之亦然:可以使用密碼檔案加密內容,然後稍後使用 prompt 方法,在 Ansible 提示時提供相同的密碼。

為了提供更多的靈活性和安全性,您可以使用 Python 腳本從其他來源獲取密碼,而不是將您的金鑰密碼存儲在純文本文件中。官方的 Ansible 存儲庫包含一些 金鑰腳本範例,您可以在創建符合項目特定需求的自定義腳本時參考這些範例。

使用 Ansible Vault 加密数据运行 Playbook

每当你运行一个使用先前通过 ansible-vault 加密的数据的 Playbook 时,你需要向 Playbook 命令提供 Vault 密码。

如果你在加密此 Playbook 中使用的数据时使用了默认选项和 prompt 密码来源,你可以使用选项 --ask-vault-pass 让 Ansible 提示你输入密码:

  1. ansible-playbook myplaybook.yml --ask-vault-pass

如果你使用了密码文件而不是提示输入密码,你应该使用选项 --vault-password-file 代替:

  1. ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py

如果你正在使用一个 vault ID 下加密的数据,你需要提供与首次加密数据时使用的相同的 vault ID 和密码来源:

  1. ansible-playbook myplaybook.yml --vault-id dev@prompt

如果在与你的 vault ID 配合使用密码文件,则应提供标签,后跟密码文件的完整路径作为密码来源:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py

如果你的 Play 使用了多个 vaults,你应该为每个 vault 提供一个 --vault-id 参数,顺序不限:

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

调试

如果在執行 Ansible 命令和 Playbook 過程中遇到錯誤,增加輸出詳細度是一個好主意,以獲取有關問題的更多信息。您可以通過在命令中包含 -v 選項來實現這一點:

  1. ansible-playbook myplaybook.yml -v

如果您需要更多細節,可以使用 -vvv,這將增加輸出的詳細程度。如果無法通過 Ansible 連接到遠程節點,請使用 -vvvv 以獲取連接調試信息:

  1. ansible-playbook myplaybook.yml -vvvv

結論

本指南涵蓋了一些您在配置服務器時可能使用的最常見的 Ansible 命令,例如如何在節點上執行遠程命令以及如何使用各種自定義設置運行 Playbook。

還有其他命令變體和標誌,您可能會發現它們對您的 Ansible 工作流程有用。要獲取所有可用選項的概述,可以使用 help 命令:

  1. ansible --help

如果您想要更全面地了解 Ansible 及其所有可用的命令和功能,請參閱 官方 Ansible 文檔

如果您想要查看 Ansible 的另一個實際示例,請查看我們的指南,該指南涵蓋了 如何使用 Ansible 在 Ubuntu 20.04 上安裝和設置 Docker

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-ansible-cheat-sheet-guide