參考:
一、Ansible 概述
1.1 Ansible 是什麼
Ansible是一款由Python開發(由Paramiko
和PyYAML
兩個關鍵模組構建)的自動化運維軟體,集合了“前輩”們的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。
1.2 Ansible 優勢
- 安裝部署簡單,易學習
- 輕量級控制端,支援多主機並行管理
- 無需裝agent,基於SSH管理
- 非root賬戶也可用
1.3 Ansible 特性
冪等性:同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的。
二、Ansible 入門
2.1 Ansible 架構
元件 | 功能 |
---|---|
Ansible | 核心程式。 |
Host Inventory | Ansible管理的主機資訊,包括IP地址、SSH埠號、賬號、密碼等。 |
Playbooks | 劇本,格式為YAML格式,模組化定義一系列任務,供外部統一呼叫。 |
Plugins | 外掛。 |
Custom modules | 自定義模組,完成核心模組無法完成的功能。 |
Core modules | 核心模組,Ansible自帶的。 |
Connection Plugins | 連線外掛,建立Ansible與其他元件間的通訊(支援多種連線方式,不侷限於SSH)。 |
Ansible Galaxy | 共享ansible role的平臺。 |
2.2 Ansible 安裝
先配置epel源(可以理解為更高階的yum源)
yum install -y epel-release
然後在控制端安裝ansible
yum install ansible
至此,ansible就安裝完成了。
2.3 Ansible 命令集
ansible
:定義並執行簡單任務。
ansible-config
:檢視、編輯、管理 Ansible 配置。
ansible-doc
:文件檢視工具。
ansible-galaxy
:分享Roles模組的官網平臺,需要網路。
ansible-playbook
:執行playbook劇本。
ansible-pull
:從倉庫拉取playbook。
ansible-vault
:檔案加解密工具。
ansible-console
:REPL控制檯執行 Ansible 任務。
2.4 Ansible 配置檔案
2.4.1 ansible.cfg 主配置檔案
預設放在/etc/ansible/ansible.cfg
路徑下,常見引數:
#這個參數列示主機清單inventory檔案的位置
inventory = /etc/ansible/hosts
#放ansible模組的目錄,支援多個目錄,用冒號隔開
library = /usr/share/ansible
#併發連線數,預設為5
forks = 5
#預設執行命令的使用者,不建議用root
sudo_user = root
#連線埠,SSH預設為22,建議修改
remote_port = 22
#設定是否檢查SSH主機的金鑰
host_key_checking = False
#SSH連線超時的時間
timeout = 60
#放ansible日誌的路徑
log_path = /var/log/ansible.log
優先順序由上往下依次遞減:
-
ANSIBLE_CONFIG:環境變數指向的配置檔案
-
./ansible.cfg:當前目錄下的配置檔案
-
~/.ansible.cfg:當前使用者目錄下ansible配置檔案
-
/etc/ansible/ansible.cfg:包管理方式安裝生成的配置檔案
2.4.2 Inventory 主機清單
Inventory主機清單放在這:/etc/ansible/hosts
注意:寫主機名的時候,在 /etc/hosts
裡需要有記錄。
有三種寫法:
-
直接指名主機IP地址或主機名(全域性)。
sky1.example.com sky2.example.com
-
定義組名,把主機IP地址或主機名加進去。
[group1] sky1.example.com 192.168.122.200 [group2] sky2.example.com 192.168.122.100
-
子組定義,關鍵字一定得是[xxx:children]。
[sky:children] sky1.example.com sky2.example.com
2.5 Ansible 免密登陸被控端(SSH)
說明:控制端生成金鑰對並把公鑰傳送到被控端的機器上,在登陸時即可實現免密。
具體實現如下:
- 控制端
#生成金鑰對,型別為rsa
ssh-keygen -t rsa
#傳送到被控端,可通過-p引數指定埠(生產環境中有可能預設SSH埠不是22)
ssh-copy-id ~/.ssh/id_rsa.pub 192.168.122.200
三、Ansible 任務執行模式
3.1 ad-hoc 命令列
ad-hoc:使用單個模組,支援批量執行單條命令。
ansible <主機或主機組> -m <模組名> -a '引數'
-m
:選項指定模組名-a
:選項指定傳送的引數
3.2 playbook 劇本
Playbook:通過YAML語法定義多個task集合來完成管理。
3.3 程式執行流程
3.4 命令執行流程
- 載入配置檔案,預設
/etc/ansible/ansible.cfg
- 通過Inventory清單,找到需要執行的主機或主機組。
- 載入要用到的模組。
- 通過ansible將模組或者命令生成對應的python指令碼,傳輸到遠端伺服器。
- 對應執行使用者家目錄的
.ansible/tmp/xxx.py
檔案 - 提權使用者執行該py檔案,並返回結果。
- 刪除py檔案,退出。
四、Ansible 常用模組
4.1 模組幫助
4.1.1 測試拓撲
4.1.2 測試的Inventory
[root@vm1 ~]# cat /etc/ansible/hosts
[test]
192.168.122.200
4.1.3 常用模組幫助命令
ansible-doc -l
:檢視所有內建模組
ansible-doc <模組名>
:檢視模組名
ansible-doc -s <模組名>
:檢視模組引數列表
4.1.4 命令前提(重要)
[root@vm1 ~]# ansible test -m ping
192.168.122.200 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
在這裡對test主機組進行ping測試,返回pong則是成功,這樣就可以開始執行下面的任務了。
4.2 命令列模組(command、shell)
4.2.1 command 模組
說明:在不通過-m引數指定模組的情況下,ad-hoc預設就是使用的command
模組,這個模組不支援shell變數和管道等,如果想要使用,請使用-m引數指定shell模組。
- 預設下,使用的是command模組,傳送命令。
[root@vm1 ~]# ansible test -m command -a "ping www.baidu.com -c 5"
192.168.122.200 | CHANGED | rc=0 >>
PING www.a.shifen.com (183.232.231.172) 56(84) bytes of data.
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=1 ttl=127 time=12.8 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=2 ttl=127 time=12.7 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=3 ttl=127 time=11.10 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=4 ttl=127 time=14.9 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=5 ttl=127 time=12.3 ms
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 12ms
rtt min/avg/max/mdev = 11.956/12.916/14.869/1.026 ms
4.2.2 shell 模組
說明:shell
模組,支援管道和shell變數。
[root@vm1 ~]# ansible test -m shell -a "echo ${HOSTNAME}"
192.168.122.200 | CHANGED | rc=0 >>
vm1
4.2 檔案操作模組
4.2.1 file 模組
說明:file
模組,可以進行對檔案的管理。
-
建立資料夾:
[root@vm1 /]# ansible test -m file -a "path=/tmp/file_test/ state=directory" 192.168.122.200 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/file_test/", "secontext": "unconfined_u:object_r:user_tmp_t:s0", "size": 6, "state": "directory", "uid": 0 }
-
建立檔案:
[root@vm1 /]# ansible test -m file -a "path=/tmp/file_test/file1 state=touch" 192.168.122.200 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "dest": "/tmp/file_test/file1", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:user_tmp_t:s0", "size": 0, "state": "file", "uid": 0 }
-
刪除檔案:
[root@vm1 /]# ansible test -m file -a "path=/tmp/file_test/file1 state=absent" 192.168.122.200 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "path": "/tmp/file_test/file1", "state": "absent" }
-
刪除資料夾:
[root@vm1 /]# ansible test -m file -a "path=/tmp/file_test state=absent" 192.168.122.200 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "path": "/tmp/file_test", "state": "absent" }
4.2.2 copy 模組
說明:copy
模組,指定src和dest可完成檔案複製
- 複製/etc/hosts到/tmp/hosts
[root@vm1 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/hosts"
192.168.122.200 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts",
"gid": 0,
"group": "root",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 158,
"src": "/root/.ansible/tmp/ansible-tmp-1625579580.7383313-3373-17711169432251/source",
"state": "file",
"uid": 0
}
後面的放到②裡面寫,嘻嘻?️♂️