Ansible
目錄
- Ansible
- Ansible介紹
- Ansible 無需代理
- Ansible作業方式
- Ansible 的控制節點
- 受管主機
- 安裝 Ansible
- 部署Ansible
- 構建Ansible清單
- 定義清單
- 使用靜態清單指定受管主機
- 驗證清單
- 覆寫清單位置
- 自定義清單檔案
- 管理Ansible組態檔
- 配置Ansible
- 組態檔優先級
- 管理組態檔中的設定
- 配置連接
- 連接設定
- 升級特權
- 非SSH連接
- 組態檔注釋
- 運行臨時命令
- 使用臨時命令通過模塊來執行任務
- 在受管主機上運行任意命令
- Ansible介紹
Ansible介紹
Ansible是一款自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運行命令等功能,
Ansible是基于模塊作業的,本身沒有批量部署的能力,真正具有批量部署的是Ansible所運行的模塊,Ansible只是提供一種框架,主要包括:
(1) 連接插件connection plugins:負責和被監控端實作通信;
(2) host inventory:指定操作的主機,是一個組態檔里面定義監控的主機;
(3) 各種模塊核心模塊、command模塊、自定義模塊;
(4) 借助于插件完成記錄日志郵件等功能;
(5) playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務,
Ansible架構圖:

ansible核心模塊網址

Ansible 無需代理
Ansible 圍繞無代理架構構建,通常而言,Ansible 通過 OpenSSH 或 WinRM 連接它所管理的主機并且運行任務,方法通常是將稱為 Ansible 模塊的小程式推送至這些主機,這些程式用于將系統置于需要的特定狀態,在 Ansible 運行完其任務后,推送的所有模塊都會被洗掉,
Ansible 不需要批準使用任何特殊代理,然后再部署到受管主機上,由于沒有代理,也不需要額外的自定義安全基礎架構,
Ansible 具有多個重要的優點:
跨平臺支持:Ansible 提供Linux、Windows、UNIX和網路設備的無代理支持,適用于物理、虛擬、云和容器環境,
人類可讀的自動化:Ansible Playbook采用YAML文本檔案撰寫,易于閱讀,有助于確保所有人都能理解它們的用途,
完美描述應用:可以通過 Ansible Playbook進行每種更改,并描述和記錄應用環境的每一個方面,
輕松管理版本控制:Ansible Playbook和專案是純文本,它們可以視作源代碼,放在現有版本控制系統中,
支持動態清單:可以從外部來源動態更新 Ansible 管理的計算機串列,隨時獲取所有受管服務器的當前正確串列,不受基礎架構或位置的影響,
編排可與其他系統輕松集成:能夠利用環境中現有的 HP SA、Puppet、Jenkins、紅帽衛星和其他系統,并且集成到 Ansible 作業流中,
Ansible作業方式
Ansible 的設計宗旨是工具易用,自動化易寫易讀,所以在創建自動化時我們應追求簡單化,
Ansible 自動化語言圍繞簡單易讀的宣告性文本檔案來構建,正確撰寫的 Ansible Playbook可以清楚地記錄你的作業自動化,
Ansible 是一種要求狀態引擎,它通過表達你所希望系統處于何種狀態來解決如何自動化IT部署的問題,Ansible 的目標是通過僅執行必要的更改,使系統處于所需的狀態,試圖將 Ansible 視為腳本語言并非正確的做法,
Ansible 的控制節點
Ansible 軟體只需要安裝到要運行它的一個(或多個)控制節點上
對控制節點的要求:
- 控制節點應是Linux或UNIX系統,不支持將Windows用作控制節點,但Windows系統可以是受管主機,
- 控制節點需要安裝Python3(版本3.5或以上)或Python2(版本2.7或以上)
受管主機
受管主機不需要安裝特殊代理
Ansible控制節點使用標準的網路協議連接受管主機
安裝 Ansible
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# rm -rf *
[root@localhost yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2495 100 2495 0 0 14505 0 --:--:-- --:--:-- --:--:-- 14421
[root@localhost yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost yum.repos.d]# cd
[root@localhost ~]# dnf -y install platform-python
[root@localhost ~]# dnf -y install centos-release-ansible-29
[root@localhost ~]# dnf -y install ansible
[root@localhost ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Sep 10 2021, 09:13:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
[root@localhost ~]# ansible -m setup localhost | grep ansible_python_version
"ansible_python_version": "3.6.8",
[root@localhost ~]# ansible -m setup localhost | less
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.222.250"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fe05:f428"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/22/2020",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "(hd0,msdos1)/vmlinuz-4.18.0-257.el8.x86_64",
"quiet": true,
"rd.lvm.lv": "cs/swap",
"resume": "/dev/mapper/cs-swap",
"rhgb": true,
"ro": true,
"root": "/dev/mapper/cs-root"
},
"ansible_date_time": {
"date": "2022-10-20",
"day": "20",
"epoch": "1666204542",
"hour": "02",
"iso8601": "2022-10-19T18:35:42Z",
"iso8601_basic": "20221020T023542964337",
測驗問答:
以下哪一個詞語最適合描述 Ansible 架構? a
a. 無代理
b. 客戶端/服務器
c. 事件驅動
d. 無狀態
Ansible 默認使用哪一種網路協議與受管節點通信? d
a. HTTP
b. HTTPS
c. SNMP
d. SSH
以下哪種檔案定義 Ansible 在受管節點上執行的操作? c
a. 主機清單
b. 清單
c. Playbook
d. 腳本
哪一種語言用于定義 Ansible Playbook? d
a. Bash
b. Perl
c. Python
d. YAML
部署Ansible
構建Ansible清單
定義清單
清單定義Ansible將要管理的一批主機,這些主機也可以分配到組中,以進行集中管理,組可以包含子組,主機也可以是多個組的成員,清單還可以設定應用到它所定義的主機和組的變數,
可以通過兩種方式定義主機清單,靜態主機清單可以通過文本檔案定義,動態主機清單可以根據需要使用外部資訊提供程式通過腳本或其他程式來生成,
使用靜態清單指定受管主機
靜態清單檔案是指定Ansible目標受管主機的文本檔案,可以使用多種不同的格式撰寫此檔案,包括INI樣式或YAML,
在最簡單的形式中,INI樣式的靜態清單檔案是受管主機的主機名或IP地址的串列,每行一個: 在/etc/ansible/hosts里面編輯
alpha.example.org
beta.example.org
192.168.1.100
但通常而言,可以將受管主機組織為主機組,通過主機組,可以更加有效的對一系列系統運行Ansible,這時,每一部分的開頭為以中括號括起來的主機組名稱,其后為該組中每一受管主機的主機名或IP地址,每行一個,
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
www[001:006].example.com //[001:006]表示001,002,003,004,005,006,也就是從001到006
上面是一組
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
db-[99:101]-node.example.com
撰寫一個清單
[root@control ~]# cd /etc/ansible/
[root@control ansible]# ls
ansible.cfg hosts roles
[root@control ansible]# vim hosts
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
www[001:006].example.com //[001:006]表示001,002,003,004,005,006,也就是從001到006
上面是一組
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
db-[99:101]-node.example.com
驗證清單
若有疑問,可使用 ansible 命令驗證計算機是否存在于清單中:
[root@control ansible]# cd
[root@control ~]# ansible db-99-node.example.com --list-hosts
hosts (1):
db-99-node.example.com //以上主機都是存在的
[root@control ~]# ansible db-999-node.example.com --list-hosts
[WARNING]: Could not match supplied host pattern, ignoring: db-999-node.example.com
[WARNING]: No hosts matched, nothing to do
hosts (0): //以上主機不存在時,顯示的內容
運行以下命令來列出指定組中的所有主機:
[root@control ~]# ansible webservers --list-hosts
hosts (9):
alpha.example.org
beta.example.org
192.168.1.100
www001.example.com
www002.example.com
www003.example.com
www004.example.com
www005.example.com
www006.example.com
如果清單中含有名稱相同的主機和主機組,ansible 命令將顯示警告并以主機作為其目標,主機組則被忽略,
應對這種情況的方法有多種,其中最簡單的是確保主機組不使用與清單中主機相同的名稱,
查看不屬于任何主機組的主機
[root@control ~]# ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
查看所有主機
[root@control ~]# ansible all --list-hosts
hosts (15):
alpha.example.org
beta.example.org
192.168.1.100
www001.example.com
www002.example.com
www003.example.com
www004.example.com
www005.example.com
www006.example.com
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
db-99-node.example.com
db-100-node.example.com
db-101-node.example.com
覆寫清單位置
(/etc/ansible/hosts)檔案被視為系統的默認靜態清單檔案,不過,通常的做法是不使用該檔案,而是在Ansible組態檔中為清單檔案定義一個不同的位置,
自定義清單檔案
[root@control ~]# vim /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts //取消注釋并修改為下面這樣
inventory = /etc/ansible/inventory
[root@control ~]# cd /etc/ansible/
[root@control ansible]# ls
ansible.cfg hosts roles
[root@control ansible]# touch inventory
[root@control ansible]# ls
ansible.cfg hosts inventory roles
[root@control ansible]# vim inventory
[root@control ansible]# cat inventory
[webservers]
192.168.222.137
192.168.222.138
[root@control ansible]# cd
[root@control ~]# ansible all --list-hosts
hosts (2):
192.168.222.137
192.168.222.138
管理Ansible組態檔
配置Ansible
可以通過修改 Ansible 組態檔中的設定來自定義 Ansible安裝的行為,Ansible從控制節點上多個可能的位置之一選擇其組態檔,
使用/etc/ansible/ansible.cfg
ansible軟體包提供一個基本的組態檔,它位于/etc/ansible/ansible.cfg,如果找不到其他組態檔,則使用此檔案,
使用~/.ansible.cfg
Ansible在用戶的家目錄中查找.ansible.cfg檔案,如果存在此組態檔并且當前作業目錄中也沒有ansible.cfg檔案,則使用此配置取代/etc/ansible/ansible.cfg,
使用./ansible.cfg
如果執行ansible命令的目錄中存在ansible.cfg檔案,則使用它,而不使用全域檔案或用戶的個人檔案,這樣,管理員可以創建一種目錄結構,將不同的環境或專案存盤在單獨的目錄中,并且每個目錄包含為獨特的一組設定而定制的組態檔,
推薦的做法是在需要運行Ansible命令的目錄中創建ansible.cfg檔案,此目錄中也將包含任何供Ansible專案使用的檔案,如清單和playbook,這是用于Ansible組態檔的最常用位置,實踐中不常使用~/.ansible.cfg或/etc/ansible/ansible.cfg檔案
使用ANSIBLE_CONFIG環境變數
我們可以通過將不同的組態檔放在不同的目錄中,然后從適當的目錄執行Ansible命令,以此利用組態檔,但是,隨著組態檔數量的增加,這種方法存在局限性并且難以管理,有一個更加靈活的選項,即通過ANSIBLE_CONFIG環境變數定義組態檔的位置,定義了此變數時,Ansible將使用變數所指定的組態檔,而不用上面提到的任何組態檔,
組態檔優先級
ANSIBLE_CONFIG環境變數指定的任何檔案將覆寫所有其他組態檔,如果沒有設定該變數,則接下來檢查運行ansible命令的目錄中是否有ansible.cfg檔案,如果不存在該檔案,則檢查用戶的家目錄是否有.ansible.cfg檔案,只有在找不到其他組態檔時,才使用全域/etc/ansible/ansible.cfg檔案,如果/etc/ansible/ansible.cfg組態檔不存在,Ansible包含它使用的默認值,
由于Ansible組態檔可以放入的位置有多種,因此Ansible當前使用哪一個組態檔可能會令人困惑,我們可以運行以下命令來清楚地確認所安裝的Ansible版本以及正在使用的組態檔,
[root@control ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Sep 10 2021, 09:13:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
Ansible僅使用具有最高優先級的組態檔中的設定,即使存在優先級較低的其他組態檔,其設定也會被忽略,不會與選定組態檔中的設定結合,因此,如果你選擇自行創建組態檔來取代全域/etc/ansible/ansible.cfg組態檔,就需要將該檔案中所有需要的設定復制到自己的用戶級組態檔中,用戶組組態檔中未定義的設定將保持設為內置默認值,即使已在全域組態檔中設為某個其他值也是如此,
管理組態檔中的設定
Ansible組態檔由幾個部分組成,每一部分含有以鍵值對形式定義的設定,部分的標題以中括號括起來,對于基本操作,請使用以下兩部分:
- [defaults]部分設定Ansible操作的默認值
- [privilege_escalation]配置Ansible如何在受管主機上執行特權升級
例如,下面是典型的ansible.cfg檔案:
[defaults]
inventory = ./inventory
remote_user = user
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
下表說明了此檔案中的指令:
Ansible配置
| 指令 | 描述 |
|---|---|
| inventory | 指定清單檔案的路徑 |
| remote_user | 要在受管主機上登錄的用戶名,如果未指定則使用當前用戶名 |
| ask_pass | 是否提示輸入SSH密碼,如果使用SSH公鑰身份驗證則可以是false |
| become | 連接后是否自動在受管主機上切換用戶(通常切換為root) 這也可以通過play來指定 |
| become_method | 如何切換用戶(通常為sudo,這也是默認設定,但可選擇su) |
| become_user | 要在受管主機上切換到的用戶(通常是root,這也是默認值) |
| become_ask_pass | 是否需要為become_method提示輸入密碼,默認為false |
配置連接
Ansible需要知道如何與其受管主機通信,更改組態檔的一個最常見原因是為了控制Ansible使用什么方法和用戶來管理受管主機,需要的一些資訊包括:
列出受管主機和主機組的清單的位置
要使用哪一種連接協議來與受管主機通信(默認為SSH),以及是否需要非標準網路埠來連接服務器
要在受管主機上使用哪一遠程用戶;這可以是root用戶或者某一非特權用戶
如果遠程用戶為非特權用戶,Ansible需要知道它是否應嘗試將特權升級為root以及如何進行升級(例如,通過sudo)
是否提示輸入SSH密碼或sudo密碼以進行登錄或獲取特權
連接設定
默認情況下,Ansible使用SSH協議連接受管主機,控制Ansible如何連接受管主機的最重要引數在[defaults]部分中設定,
默認情況下,Ansible嘗試連接受管主機時使用的用戶名與運行ansible命令的本地用戶相同,若要指定不同的遠程用戶,請將remote_user引數設定為該用戶名,
如果為運行Ansible的本地用戶配置了SSH私鑰,使得它們能夠在受管主機上進行遠程用戶的身份驗證,則Ansible將自動登錄,如果不是這種情況,可以通過設定指令ask_pass = true,將Ansible配置為提示本地用戶輸入由遠程用戶使用的密碼,
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = true
假設在使用一個Linux控制節點,并對受管主機使用OpenSSH,如果可以使用密碼以遠程用戶身份登錄,那么我們可以設定基于SSH密鑰的身份驗證,從而能夠設定ask_pass = false,
第一步是確保在~/.ssh中為控制節點上的用戶配置了SSH密鑰對,并且使用ssh-copy-id命令將本地的公鑰復制到受管主機中,
[root@control ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qjOOU8Fw2Dlrl0rVgSnIdkHYgAK1k6LC0MZV5Z5RAKk root@control
The key's randomart image is:
+---[RSA 3072]----+
|o+oO++oB+o. |
|ooB+O =... |
|+.B= * .o |
|+o .E o. o |
|o. o + S |
|. o . |
| . . |
| ..o. |
| .ooo |
+----[SHA256]-----+
[root@control ~]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.222.137 (192.168.222.137)' can't be established.
ECDSA key fingerprint is SHA256:jJ7HFCOrVQKPjfacavF08vxsn4hSKTG3q9SV78ApryQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
[root@control ~]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.222.138 (192.168.222.138)' can't be established.
ECDSA key fingerprint is SHA256:hbtTaGj2vCLMFuGhq4w/WkcSJKQKqlkFRFyigFAZGZY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
升級特權
鑒于安全性和審計原因,Ansible可能需要先以非特權用戶身份連接遠程主機,然后再通過特權升級獲得root用戶身份的管理權限,這可以在Ansible組態檔的[privilege_escalation]部分中設定,
要默認啟用特權升級,可以在組態檔中設定指令become = true,即使默認為該設定,也可以在運行臨時命令或Ansible Playbook時通過各種方式覆寫它,(例如,有時候可能要運行一些不需要特權升級的任務或play,)
become_method指令指定如何升級特權,有多個選項可用,但默認為使用sudo,類似地,become_user指令指定要升級到的用戶,但默認為root,
如果所選的become_method機制要求用戶輸入密碼才能升級特權,可以在組態檔中設定become_ask_pass = true指令,
以下示例ansible.cfg檔案假設你可以通過基于SSH密鑰的身份驗證以someuser用戶身份連接受管主機,并且someuser可以使用sudo以root用戶身份運行命令而不必輸入密碼:
[defaults]
inventory = ./inventory
remote_user = someuser
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false //設定become_ask_pass提權不需要密碼的時候,也需要在visudo里設定不需要密碼
非SSH連接
默認情況下,Ansible用于連接受管主機的協議設定為smart,它會確定使用SHH的最高效方式,可以通過多種方式將其設定為其他的值,
例如,默認使用SSH的規則有一個例外,如果目錄中沒有localhost,Ansible將設定一個隱式localhost條目以便允許運行以localhost為目標的臨時命令和playbook,這一特殊清單條目不包括在all或ungrouped主機組中,此外,Ansible不使用smart SSH連接型別,而是利用默認的特殊local連接型別來進行連接,
[root@control ~]# ansible localhost --list-hosts
hosts (1):
localhost
local連接型別忽略remote_user設定,并且直接在本地系統上運行命令,如果使用特權升級,它會在運行sudo時使用運行Ansible命令的用戶,而不是remote_user,如果這兩個用戶具有不同的sudo特權,這可能會導致混淆,
如果你要確保像其他受管主機一樣使用SSH連接localhost,一種方法是在清單中列出它,但是,這會將它包含在all和ungrouped組中,而你可能不希望如此,
另一種方法是更改用于連接localhost的協議,執行此操作的最好方法是為localhost設定ansible_connection主機變數,為此,你需要在運行Ansible命令的目錄中創建host_vars子目錄,在該子目錄中,創建名為localhost的檔案,其應含有ansible_connection: smart這一行,這將確保對localhost使用smart(SSH)連接協議,而非local,
你也可以通過另一種變通辦法來使用它,如果清單中列有127.0.0.1,則默認情況下,將會使用smart來連接它,也可以創建一個含有ansible_connection: local這一行的host_vars/127.0.0.1檔案,它會改為使用local,
組態檔注釋
Ansible組態檔允許使用兩種注釋字符:井號或分號,
位于行開頭的#號會注釋掉整行,它不能和指令位于同一行中,
分號字符可以注釋掉所在行中其右側的所有內容,它可以和指令位于同一行中,只要該指令在其左側,
運行臨時命令
使用臨時命令可以快速執行單個Ansible任務,不需要將它保存下來供以后再次運行,它們是簡單的在線操作,無需撰寫playbook即可運行,
臨時命令對快速測驗和更改很有用,例如,可以使用臨時命令確保一組服務器上的/etc/hosts檔案中存在某一特定的行,可以使用另一個臨時命令在許多不同的計算機上高效的重啟服務,或者確保特定的軟體包為最新版本,
臨時命令對于通過Ansible快速執行簡單的任務非常有用,它們確實也存在局限,而且總體而言,要使用Ansible Playbook來充分發揮Ansible的作用,但在許多情形中,臨時命令正是快速執行簡單任務所需要的工具,
Ansible運行臨時命令的語法如下:
ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
host-pattern引數用于指定在其上運行臨時命令的受管主機,它可以是清單中的特定受管主機或主機組,也可以用后面的-i選項指定特定的清單而不使用默認清單,
-m選項將Ansible應在目標主機上運行的module名稱作為引數,模塊是為了實施任務而執行的小程式,一些模塊不需要額外的資訊,但其他模塊需要使用額外的引數來指定其操作詳情,-a選項以帶引號字串形式取這些引數的串列,
一種最簡單的臨時命令使用ping模塊,此模塊不執行ICMP ping,而是檢查能否在受管主機上運行基于Python的模塊,例如,以下臨時命令確定清單中的所有受管主機能否運行標準的模塊:
所有主機執行ping模塊
[root@control ~]# ansible all -m ping

//綠色才是正常狀態
使用臨時命令通過模塊來執行任務
模塊是臨時命令用于完成任務的工具,Ansible提供了數百個能夠完成不同任務的模塊,通常我們可以查找一個經過測驗的專用模塊,作為標準安裝的一部分來完成所需的任務,
ansible-doc -l命令可以列出系統上安裝的所有模塊,可以使用ansible-doc來按照名稱查看特定模塊的幫助檔案,再查找關于模塊將取什么引數作為選項的資訊,例如以下命令顯示ping模塊的幫助檔案,在幫助檔案里面輸入q命令表示退出:
ansible-doc ping
Ansible常用模塊
| 模塊類別 | 模塊 |
|---|---|
| 檔案模塊 | copy:將本地檔案復制到受管主機 file:設定檔案的權限和其他屬性 lineinfile:確保特定行是否在檔案中 synchronize:使用rsync同步內容 |
| 軟體包模塊 | package:使用作業系統本機的自動檢測軟體包管理器管理軟體包 yum:使用yum管理軟體包 apt:使用APT管理軟體包 dnf:使用dnf管理軟體包 gem:管理Ruby gem pip:從PyPI管理Python軟體包 |
| 系統模塊 | firewalld:使用firewalld管理防火墻 reboot:重啟計算機 service:管理服務 user:添加、洗掉和管理用戶帳戶 |
| Net Tools模塊 | get_url:通過HTTP、HTTPS或FTP下載檔案 nmcli:管理網路 uri:與Web服務互動 |
大部分模塊會取用引數,可在模塊的檔案中找到可用于該模塊的引數串列,臨時命令可以通過-a選項向模塊傳遞引數,無需引數時,可從臨時命令中省略-a選項,如果需要指定多個引數,請以引號括起的空格分隔串列形式提供,
利用user模塊,使192.168.169.140主機上存在tushanbu用戶,uid為2000
[root@control ~]# ansible 192.168.222.137 -m user -a 'name=tushanbu uid=2000 state=present'
192.168.222.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 2000,
"home": "/home/tushanbu",
"name": "tushanbu",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 2000
}

大多數模塊為idempotent,這表示它們可以安全地多次運行;如果系統已處于正確的狀態,它們不會進行任何操作,
在受管主機上運行任意命令
command模塊允許管理員在受管主機的命令列中運行任意命令,要運行的命令通過-a選項指定為該模塊的引數,例如,以下命令將對webservers組的受管主機運行hostname命令:
[root@control ~]# ansible webservers -m command -a 'hostname'
192.168.222.137 | CHANGED | rc=0 >>
node1
192.168.222.138 | CHANGED | rc=0 >>
node2
這條命令為每個受管主機回傳兩行輸出,第一行是狀態報告,顯示對其運行臨時操作的受管主機名稱及操作的結果,第二行是使用Ansible command模塊遠程執行的命令的輸出,
若要改善臨時命令輸出的可讀性和決議,管理員可能會發現使對受管主機執行的每一項操作具有單行輸出十分有用,使用-o選項以單行格式顯示Ansible臨時命令的輸出,
[root@control ~]# ansible webservers -m command -a 'hostname' -o
192.168.222.137 | CHANGED | rc=0 | (stdout) node1
192.168.222.138 | CHANGED | rc=0 | (stdout) node2
command模塊允許管理員對受管主機快速執行遠程命令,這些命令不是由受管主機上的shell加以處理,因此,它們無法訪問shell環境變數,也不能執行重定向和管道等shell操作,
在命令需要shell處理的情形中,管理員可以使用shell模塊,與command模塊類似,可以在臨時命令中將要執行的命令作為引數傳遞給該模塊,Ansible隨后對受管主機遠程執行該命令,與command模塊不同的是,這些命令將通過受管主機上的shell進行處理,因此,可以訪問shell環境變數,也可以使用重定向和管道等操作,
以下示例演示了command與shell的區別,如果嘗試使用這兩個模塊執行內建的Bash命令set,只有使用shell模塊才會成功:
[root@control ~]# ansible 192.168.222.137 -m command -a 'set'
192.168.222.137 | FAILED | rc=2 >>
[Errno 2] No such file or directory: b'set': b'set'
[root@control ~]# ansible 192.168.222.137 -m shell -a 'set'
192.168.222.137 | CHANGED | rc=0 >>
BASH=/bin/sh
BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_EXECUTION_STRING=set
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="19" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.4.19(1)-release'
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
DIRSTACK=()
EUID=0
GROUPS=()
HOME=/root
HOSTNAME=node1
HOSTTYPE=x86_64
IFS='
'
LANG=C
LC_ALL=C
LC_CTYPE=C.UTF-8
LC_MESSAGES=C
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
POSIXLY_CORRECT=y
PPID=204196
PS4='+ '
PWD=/root
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=3
SSH_CLIENT='192.168.222.250 44516 22'
SSH_CONNECTION='192.168.222.250 44516 192.168.222.137 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=11
_=/usr/libexec/platform-python

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/518691.html
標籤:其他
