在我之前的文章中, ansible 庫存和配置文件 這為學習ansible奠定了基礎。本文通過一些示例描述了 ansible ad-hoc 命令。
內容
介紹
Ansible ad hoc 命令對於執行快速或不經常重複的任務很有用。這些臨時命令通常是可以直接從終端或 shell 腳本運行的單行命令。
在了解如何使用 ad-hoc 命令之前,您需要了解什麼是冪等性。Ansible 是 相同的 本質上,這意味著如果對象的狀態發生變化,無論您執行多少次相同的任務,ansible 都不會嘗試對對象進行相同的更改。
臨時命令已通過 /usr/bin/ansible
程序。您可以通過運行以下命令獲取 ansible 命令支持的選項列表:
$ ansible --help
如果您沒有可使用的 ansible 實驗室,您可以查看我們的指南,了解如何手動設置 ansible 並使用 Vagrant 和 Virtualbox。
- 在 Linux 上安裝和配置 Ansible
- 在 Linux 上使用 Vagrant 和 Virtualbox 自動化 Ansible Lab 設置
了解目標
在使用臨時命令或創建劇本之前,您應該清楚地了解您的業務需求和目標環境。
目標環境可以是ansible支持的任何服務器、網絡設備、容器、雲解決方案等。這裡我們有兩個運行 Ubuntu 20.04 的託管節點。
您可以通過運行以下命令查看在運行 ad-hoc 命令或 playbook 時將使用的主機列表:
#SYNTAX $ ansible --list-hosts
組名是 默認(全部, 未分類) 還 用戶定義組.
如果您想了解更多關於該組的信息,請參閱下面的鏈接。
- Ansible 庫存和配置文件
獲取所有組中的主機列表。
$ ansible all --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
獲取用戶定義組中的主機列表。這裡我的組名是 Ubuntu.
$ ansible ubuntu --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
庫存文件
清單文件包含受管節點的列表。庫存文件的位置是 ansible.cfg
文檔。你可以使用它 -i
還 --inventory
運行臨時命令時的標誌。
我有兩個清單文件,默認文件名是主機。要使用文件 host2,你應該使用 -i
標記並將文件作為參數傳遞。
$ ansible all -i host2 --list-hosts hosts (1): managed2.anslab.com
當心: 如果清單文件位於其他位置,則必須指定絕對路徑。有關清單文件優先級,請參閱下面的鏈接。
- Ansible 庫存和配置文件
模塊
Ansible 是一種電池供電的工具。這意味著它帶有大量模塊。模塊是編寫的程序 Python Ansible 使用它在託管節點上運行並執行任務。 Ansible 遵循即插即用的方法。這意味著您可以編寫自己的模塊並使用 ansible 運行它。
Ansible 支持開源社區和各種產品供應商創建的許多包。要獲取計算機上安裝的所有模塊的列表,請運行以下命令:
$ ansible-doc -l # LIST ALL MODULES AVAILABLE $ ansible-doc -l | grep -i -w ^apt # GREP PARTICULAR MODULE(APT) MODULE
要查看模塊文檔,您可以運行以下命令:在這裡,我們正在查看 apt 模塊的文檔,這是一個用於基於 Debian/Ubuntu 的發行版的包管理器模塊。
$ ansible-doc apt
下圖顯示了 ansible apt 模塊文檔。
即席命令語法
當您運行臨時命令時,您必須提供一些輸入。
- 必須指定目標(受管節點)。您可以使用默認的“All/Ungrouped”組或用戶定義的組。
- 您必須將模塊名稱作為參數傳遞
-m
橫幅。 - 每個模塊接受一組選項。這些選項必須作為參數傳遞給 -a 標誌。如果有多個選項,它們必須用引號引起來。
$ ansible [group] -m [module] -a [module arguments]
您可以將在上一節中看到的其他參數組合到您的 ad-hoc 命令中。
使用 Ping 模塊檢查連接
設置 ansible 後,要運行的第一個模塊是: “平坦的” 模塊。 ping 模塊用於驗證與控制器和受管節點的正確連接。成功的連接將返回類似於以下內容的響應: “乒乓球”.
$ ansible all -m ping
你也可以使用 -o
橫幅。
$ ansible all -m ping -o

通過 shell 模塊執行命令
這個 外殼模塊 用於運行可以在終端中運行的任何命令。 這就像在 Linux 終端中運行命令一樣。
你應該使用 -a
標記命令並將其作為參數傳遞給 shell 模塊。
$ ansible all -m shell -a "arguments"
下面是我在 ansible shell 模塊中運行的一些命令。
$ ansible all -m shell -a "echo $USER"
$ ansible all -m shell -a "uptime"
$ ansible all -m shell -a "cat /etc/os-release | grep -i PRETTY_NAME"
$ ansible all -m shell -a "touch /tmp/abc.txt"
$ ansible all -m shell -a "ls -l /tmp/abc.txt"

除了 shell 模塊,還可以使用 ansible 的默認模塊 command 模塊。可以直接使用 -a
由於命令模塊是默認模塊,因此標記命令並將其作為參數傳遞。
$ ansible all -m command -a "uptime" # EXCLUSIVELY PASSING COMMAND MODULE $ ansible all -a "uptime" # NOT USING -m TO PASS MODULE

shell 和命令模塊之間的區別在於命令模塊可以訪問一些特殊的變量,並且不能使用管道、重定向和邏輯與運算符。
運行以下命令時出現錯誤:
$ ansible all -m command -a "test -f /etc/hosts && echo 'hosts file present'"
當我通過 shell 模塊運行相同的命令時,它工作正常。
$ ansible all -m shell -a "test -f /etc/hosts && echo 'hosts file present'"

通過腳本模塊運行腳本
如果您想運行任意腳本(python、shell 等),您可以使用腳本模塊。該模塊將腳本從控制器機器複製到所有被管節點,然後執行該腳本。
我有以下python代碼 /tmp
目錄。
import sys,os print("CURRENT PYTHON VERSION = ", sys.version_info) print("HOSTNAME = ", os.uname()[1]) print("CURRENT DIRECTORY = ", os.getcwd())
通過運行以下命令,使用腳本模塊運行腳本:腳本模塊支持附加參數,具體取決於腳本的運行方式。在我的情況下,我正在運行一個 python 腳本,所以我試圖傳遞額外的參數 “可執行文件 = python3” 連同腳本路徑。
$ ansible all -m script -a "/tmp/get_host_details.py executable=python3"

包管理模塊
您的操作系統包管理器有幾個模塊可用。 dnf
, apt
, pacman
等待。我在這裡使用 apt
因為我正在運行 Ubuntu。但是,儘管所有包管理器的語法相同,但參數卻不同。查看相應的文檔以獲取更多詳細信息。
要安裝軟件包,請運行以下命令並檢查狀態 “節目”. 你應該選擇 -b
還 -become
運行模塊的標誌 sudo
受管節點權限。如果你設置密碼 sudo 用戶你需要通過 -K
一起 -b
提示標誌 變得 密碼。
$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=present" -b -K

使用下面的鏈接閱讀有關權限提升如何工作的文章。
- Ansible SSH 身份驗證和權限提升
要刪除軟件包,請運行以下命令並檢查狀態 “缺席”.
$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=absent" -b -K

到目前為止,我們已經展示瞭如何為不同的任務使用不同的模塊。這可能會讓您對運行臨時命令時的行為方式有一個很好的了解。
還有很多其他的模塊,本文不足以全部閱讀。因此,我們建議您根據自己的用例選擇模塊並開始練習 ad-hoc 命令。
輸出顏色
運行 ad-hoc 命令後,您應該已經看到了三種不同顏色的輸出。所有顏色都有其含義。
RED - Failure YELLOW - Success With Changes happened GREEN - Success but no changes happened
紅色 – 失敗
如果任務失敗,它將以紅色打印。

黃色 – 更改成功
如果狀態設置為更改,則輸出將為黃色。

綠色——成功但沒有改變
如果對象的狀態沒有改變,輸出將為綠色。

結論是
本文解釋了什麼是 ad-hoc 命令以及如何在 Ansible 中使用它們。 Ad-hoc 命令是新手了解 ansible 如何使用模塊完成任務的好方法。在下一個級別,我們開始以 YAML 格式編寫劇本。更多關於這在另一篇文章中。
閱讀以下:
- 使用 Ansible 劇本
資源:
- https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
- https://www.redhat.com/sysadmin/ansible-ad-hoc-commands
Ad Hoc 命令AnsibleAnsible Ad Hoc 命令Ansible 系列Ansible 教程DevOpsIT自動化LinuxLinux 管理開源