如何使用 Ansible 安裝軟體
Ansible 是系統管理員和開發人員用來保持計算機系統處於最佳狀態的一種流行的自動化工具。與可擴展框架一樣,Ansible 本身功能有限,它真正的功能體現在許多模塊中。在某種程度上,Ansible 模塊就是 Linux 系統的命令。它們針對特定問題提供解決方案,而維護計算機時的一項常見任務是使所有計算機的更新和一致。
我曾經使用軟體包的文本列表來保持系統或多或少的同步:我會列出筆記本電腦上安裝的軟體包,然後將其與台式機或另一台伺服器之間進行交叉參考,手動彌補差異。當然,在 Linux 機器上安裝和維護應用程序是 Ansible 的一項基本功能,這意味著你可以在自己關心的計算機上列出所需的內容。
尋找正確的 Ansible 模塊
Ansible 模塊的數量非常龐大,如何找到能完成你任務的模塊?在 Linux 中,你可以在應用程序菜單或 /usr/bin
中查找要運行的應用程序。使用 Ansible 時,你可以參考 Ansible 模塊索引。
這個索引按照類別列出。稍加搜索,你就很可能找到所需的模塊。對於包管理,Packaging 模塊幾乎適用於所有帶包管理器的系統。
動手寫一個 Ansible 劇本
首先,選擇本地計算機上的包管理器。例如,如果你打算在運行 Fedora 的筆記本電腦上編寫 Ansible 指令(在 Ansible 中稱為「 劇本 」),那麼從 dnf
模塊開始。如果你在 Elementary OS 上編寫,使用 apt
模塊,以此類推。這樣你就可以開始進行測試和驗證,並可以在以後擴展到其它計算機。
第一步是創建一個代表你的劇本的目錄。這不是絕對必要的,但這是一個好習慣。Ansible 只需要一個配置文件就可以運行在 YAML 中,但是如果你以後想要擴展劇本,你就可以通過改變目錄和文件的方式來控制 Ansible。現在,只需創建一個名為 install_packages
或類似的目錄:
$ mkdir ~/install_packages
你可以根據自己的喜好來命名 Ansible 的劇本,但通常將其命名為 site.yml
:
$ touch ~/install_packages/site.yml
在你最喜歡的文本編輯器中打開 site.yml
,添加以下內容:
- hosts: localhost
tasks:
- name: install packages
become: true
become_user: root
dnf:
state: present
name:
- tcsh
- htop
你必須調整使用的模塊名稱以匹配你使用的發行版。在此示例中,我使用 dnf
是因為我在 Fedora Linux 上編寫劇本。
就像 Linux 終端中的命令一樣,知道 如何 來調用 Ansible 模塊就已經成功了一半。這個示例劇本遵循標準劇本格式:
hosts
是一台或多台計算機。在本示例中,目標計算機是localhost
,即你當前正在使用的計算機(而不是你希望 Ansible 連接的遠程系統)。tasks
是你要在主機上執行的任務列表。name
是任務的人性化名稱。在這種情況下,我使用install packages
,因為這就是該任務正在做的事情。become
允許 Ansible 更改運行此任務的用戶。become_user
允許 Ansible 成為root
用戶來運行此任務。這是必須的,因為只有 root 用戶才能使用dnf
安裝應用程序。dnf
是模塊名稱,你可以在 Ansible 網站上的模塊索引中找到。
dnf
下的節點是 dnf
模塊專用的。這是模塊文檔的關鍵所在。就像 Linux 命令的手冊頁一樣,模塊文檔會告訴你可用的選項和所需的參數。
![Ansible 文檔](/data/attachment/album/202010/10/095127cmv2vv47sm44e2v5.png "Ansible documentation")
安裝軟體包是一個相對簡單的任務,僅需要兩個元素。state
選項指示 Ansible 檢查系統上是否存在 軟體包,而 name
選項列出要查找的軟體包。Ansible 會針對機器的 狀態 進行調整,因此模塊指令始終意味著更改。假如 Ansible 掃描了系統狀態,發現劇本里描述的系統(在本例中,tcsh
和 htop
存在)與實際狀態存在衝突,那麼 Ansible 的任務是進行必要的更改來使系統與劇本匹配。Ansible 可以通過 dnf
(或 apt
或者其它任何包管理器)模塊進行更改。
每個模塊可能都有一組不同的選項,所以在編寫劇本時,要經常參考模塊文檔。除非你對模塊非常熟悉,否則這是期望模塊完成工作的唯一合理方法。
驗證 YAML
劇本是用 YAML 編寫的。因為 YAML 遵循嚴格的語法,所以安裝 yamllint
來檢查劇本是很有幫助的。更妙的是,有一個專門針對 Ansible 的檢查工具稱為 ansible-lint
,它專門為劇本而生。在繼續之前,安裝它。
在 Fedora 或 CentOs 上:
$ sudo dnf ins tall yamllint python3-ansible-lint
在 Debian、Elementary 或 Ubuntu 上,同樣的:
$ sudo apt install yamllint ansible-lint
使用 ansible-link
來驗證你的劇本。如果你無法使用 ansible-lint
,你可以使用 yamllint
。
$ ansible-lint ~/install_packages/site.yml
成功則不返回任何內容,但如果文件中有錯誤,則必須先修復它們,然後再繼續。複製和粘貼過程中的常見錯誤包括在最後一行的末尾省略換行符、使用製表符而不是空格來縮進。在文本編輯器中修復它們,重新運行 ansible-llint
,重複這個過程,直到 ansible-lint
或 yamllint
沒有返回為止。
使用 Ansible 安裝一個應用
現在你有了一個可驗證的有效劇本,你終於可以在本地計算機上運行它了,因為你碰巧知道該劇本定義的任務需要 root 許可權,所以在調用 Ansible 時必須使用 --ask-become-pass
選項,因此系統會提示你輸入管理員密碼。
開始安裝:
$ ansible-playbook --ask-become-pass ~/install_packages/site.yml
BECOME password:
PLAY [localhost] ******************************
TASK [Gathering Facts] ******************************
ok: [localhost]
TASK [install packages] ******************************
ok: [localhost]
PLAY RECAP ******************************
localhost: ok=0 changed=2 unreachable=0 failed=0 [...]
這些命令被執行後,目標系統將處於與劇本中描述的相同的狀態。
在遠程系統上安裝應用程序
通過這麼多操作來替換一個簡單的命令可能會適得其反,但是 Ansible 的優勢是它可以在你的所有系統中實現自動化。你可以使用條件語句使 Ansible 在不同的系統上使用特定的模塊,但是現在,假定所有計算機都使用相同的包管理器。
要連接到遠程系統,你必須在 /etc/ansible/hosts
文件中定義遠程系統,該文件與 Ansible 是一起安裝的,所以它已經存在了,但它可能是空的,除了一些解釋性注釋之外。使用 sudo
在你喜歡的文本編輯器中打開它。
你可以通過其 IP 地址或主機名(只要主機名可以解析)定義主機。例如,如果你已經在 /etc/hosts
中定義了 liavara
並可以成功 ping
通,那麼你可以在 /etc/ansible/hosts
中將 liavara
設置為主機。或者,如果你正在運行一個域名伺服器或 Avahi 伺服器並且可以 ping
通 liavara
,那麼你就可以在 /etc/ansible/hosts
中定義它。否則,你必須使用它的 IP 地址。
你還必須成功地建立與目標主機的安全 shell(SSH)連接。最簡單的方法是使用 ssh-copy-id
命令,但是如果你以前從未與主機建立 SSH 連接,閱讀我關於如何創建自動 SSH 連接的文章。
一旦你在 /etc/ansible/hosts
文件中輸入了主機名或 IP 地址後,你就可以在劇本中更改 hosts
定義:
- hosts: all
tasks:
- name: install packages
become: true
become_user: root
dnf:
state: present
name:
- tcsh
- htop
再次運行 ansible-playbook
:
$ ansible-playbook --ask-become-pass ~/install_packages/site.yml
這次,劇本會在你的遠程系統上運行。
如果你添加更多主機,則有許多方法可以過濾哪個主機執行哪個任務。例如,你可以創建主機組(伺服器的 webserves
,台式機的 workstations
等)。
適用於混合環境的 Ansible
到目前為止,我們一直假定 Ansible 配置的所有主機都運行相同的操作系統(都是是使用 dnf
命令進行程序包管理的操作系統)。那麼,如果你要管理不同發行版的主機,例如 Ubuntu(使用 apt
)或 Arch(使用 pacman
),或者其它的操作系統時,該怎麼辦?
只要目標操作系統具有程序包管理器(MacOs 有 Homebrew,Windows 有 Chocolatey),Ansible 就能派上用場。
這就是 Ansible 優勢最明顯的地方。在 shell 腳本中,你必須檢查目標主機上有哪些可用的包管理器,即使使用純 Python,也必須檢查操作系統。Ansible 不僅內置了這些功能,而且還具有在劇本中使用命令結果的機制。你可以使用 action
關鍵字來執行由 Ansible 事實收集子系統提供的變數定義的任務,而不是使用 dnf
模塊。
- hosts: all
tasks:
- name: install packages
become: true
become_user: root
action: >
{{ ansible_pkg_mgr }} name=htop,transmission state=present update_cache=yes
action
關鍵字會載入目標插件。在本例中,它使用了 ansible_pkg_mgr
變數,該變數由 Ansible 在初始 收集信息 期間填充。你不需要告訴 Ansible 收集有關其運行操作系統的事實,所以很容易忽略這一點,但是當你運行一個劇本時,你會在默認輸出中看到它:
TASK [Gathering Facts] *****************************************
ok: [localhost]
action
插件使用來自這個探針的信息,使用相關的包管理器命令填充 ansible_pkg_mgr
,以安裝在 name
參數之後列出的程序包。使用 8 行代碼,你可以克服在其它腳本選項中很少允許的複雜跨平台難題。
使用 Ansible
現在是 21 世紀,我們都希望我們的計算機設備能夠互聯並且相對一致。無論你維護的是兩台還是 200 台計算機,你都不必一次又一次地執行相同的維護任務。使用 Ansible 來同步生活中的計算機設備,看看 Ansible 還能為你做些什麼。
via: https://opensource.com/article/20/9/install-packages-ansible
作者:Seth Kenlon 選題:lujun9972 譯者:MjSeven 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive