目錄
- 寫在前面
- 1. Ansible是什么
- 1.1 簡介與來歷
- 1.2 Ansible的特點
- 1.3Ansible的架構與工作流程
- 1.3.1 ansible 任務執行模式
- 1.3.2 ansible 執行流程
- 1.4 Ansible的模塊
- 2. Ansible實驗初始化
- 2.1 實驗環境
- 2.2Ansible的安裝
- 2.2.1 Ansible的程序結構
- 2.3 修改Ansible配置文件
- 2.3.1 配置文件中常見參數
- 2.4 Ansible的命令參數
- 3. Ansible Inventory 主機清單文件
- 3.1 設置Inventory
- 3.2.1 子組
- 3.2.2 指定ansible用戶、密碼、端口(不推薦)
寫在前面
在ansible部分,決定以多篇文章的方式進行記錄。寫成一篇太累太費時太費腦TuT
1. Ansible是什么
1.1 簡介與來歷
Ansible 是一個開源的基于Python開發的自動化工具,用于配置管理、應用程序部署和任務自動化。它旨在簡化 IT 基礎設施管理,使得開發運維 (DevOps) 流程更加高效和可靠。
Ansible 由 Michael DeHaan 于 2012 年創建,并于同年發布。它由 Red Hat 贊助,并于 2015 年被 Red Hat 收購。Ansible 的設計理念是簡潔易用,旨在解決傳統自動化工具復雜性和學習曲線的問題。
1.2 Ansible的特點
- 無客戶端模式:僅需在控制端部署Ansible環境,被控端無需操作;
- SSH工作:基于ssh協議對設備進行管理;
- 框架概念:Ansible基于模塊進行工作,本身沒有能力,真正工作的是運行的模塊
- playbook:使用基于yaml的playbook實現自動化操作;
- 可擴展性:支持API等方式擴展;
- 冪等性:不關注執行過程,執行的結果無關次數,結果相同;
1.3Ansible的架構與工作流程
1.3.1 ansible 任務執行模式
Ansible 系統由控制主機對被管節點的操作方式可分為兩類,即adhoc和playbook
- ad-hoc模式(點對點模式)
使用單個模塊,支持批量執行單條命令。ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當于bash中的一句話shell。 - playbook模式(劇本模式)
是Ansible 主要管理方式 ,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解為通過組合多條ad-hoc操作的配置文件。
1.3.2 ansible 執行流程
Ansible在運行時, 首先讀取ansible.cfg
中的配置, 根據規則獲取Inventory
中的管理主機列表, 并行的在這些主機中執行配置的任務, 最后等待執行返回的結果。
- 命令執行過程:
- 加載自己的配置文件,默認/etc/ansible/ansible.cfg;
- 查找對應的主機配置文件,找到要執行的主機或者組;
- 加載自己對應的模塊文件,如 command;
- 通過ansible將模塊或命令生成對應的臨時py文件(python腳本), 并將文件傳輸至遠程服務器;
- 對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件;
- 給文件 +x 執行權限;
- 執行并返回結果;
- 刪除臨時py文件,sleep 0退出;
1.4 Ansible的模塊
- Ansible:Ansible核心程序。
- Host Inventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。
- Playbooks:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
- CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管理任務。
- CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
- ConnectionPlugins:連接插件,Ansible和Host通信使用
2. Ansible實驗初始化
2.1 實驗環境
Server: manager CentOS8 192.168.100.151
Host01: front CentOS8 192.168.100.148
Host02: storage CentOS8 192.168.100.150
Host03: backup CentOS8 192.168.100.149
2.2Ansible的安裝
#ansible需要有epel源的支持,所以先安裝epel-release
[root@manager ~]# yum install -y epel-release[root@manager ~]# yum install -y ansible[root@manager ~]# ansible --version
ansible [core 2.16.2]config file = /etc/ansible/ansible.cfgconfigured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python3.11/site-packages/ansibleansible collection location = /root/.ansible/collections:/usr/share/ansible/collectionsexecutable location = /usr/bin/ansiblepython version = 3.11.5 (main, Oct 25 2023, 14:45:39) [GCC 8.5.0 20210514 (Red Hat 8.5.0-21)] (/usr/bin/python3.11)jinja version = 3.1.2libyaml = True######也可以用pip安裝,首先安裝python-pip,然后pip拉取ansible的包
yum install -y python-pip
pip install ansible
2.2.1 Ansible的程序結構
- 配置文件目錄:/etc/ansible/
- 執行文件目錄:/usr/bin/ansible
- lib庫依賴目錄:/usr/lib/pythonx.xx/site-packages/ansible*
- help文檔目錄:/usr/share/doc/ansible*
- man文檔目錄:/usr/share/man/man1/ansible*
2.3 修改Ansible配置文件
從 Ansible 2.12 版本開始,默認的配置文件不再有具體內容。但可以通過運行一個命令來生成一個示例配置文件。這個文件會包含所有默認設置,但都是被注釋掉的(即“disabled”),如同2.12版本之前一樣。
#生成配置文件 ansible-config init --disabled > ansible.cfg#或者更加完整的 ansible-config init --disabled -t all > ansible.cfg
關于配置文件,這里修改兩點:
- 關閉主機密鑰檢查(host_key_checking)
- 開啟日志功能
#不必生成新的配置文件,就在空的配置文件內添加即可
cat >> /etc/ansible/ansible.cfg << EOF
[defaults]
host_key_checking = False
log_path = /var/log/ansible.log
EOF
2.3.1 配置文件中常見參數
inventory = /etc/ansible/hosts #這個參數表示資源清單inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模塊的目錄,支持多個目錄方式,只要用冒號(:)隔開就可以
forks = 5 #并發連接數,默認為5
sudo_user = root #設置默認執行命令的用戶
remote_port = 22 #指定連接被管節點的管理端口,默認為22端口,建議修改,能夠更加安全
ask_pass = True #是否需要密碼
host_key_checking = False #設置是否檢查SSH主機的密鑰,值為True/False。關閉后第一次連接不會提示配置實例
timeout = 60 #設置SSH連接的超時時間,單位為秒
log_path = /var/log/ansible.log #指定一個存儲ansible日志的文件(默認不記錄日志)
2.4 Ansible的命令參數
# ansible 命令參數
# anisble命令語法: ansible [-i 主機文件] [-f 批次] [組名] [-m 模塊名稱] [-a 模塊參數]
ansible詳細參數:-v,-verbose # 詳細模式,如果命令執行成功,輸出詳細的結果 (-vv –vvv -vvvv)-i PATH, -inventory=PATH # 指定 host 文件的路徑,默認是在 /etc/ansible/hosts
inventory [??nv?ntri] 庫存-f NUM,-forks=NUM # NUM 是指定一個整數,默認是 5 ,指定 fork 開啟同步進程的個數。-m NAME,-module-name=NAME # 指定使用的 module 名稱,默認使用 command模塊-a,MODULE_ARGS #指定 module 模塊的參數-k,-ask-pass #提示輸入 ssh 的密碼,而不是使用基于 ssh 的密鑰認證-sudo # 指定使用 sudo 獲得 root 權限-K,-ask-sudo-pass #提示輸入 sudo 密碼,與 -sudo 一起使用-u USERNAME,-user=USERNAME # 指定移動端的執行用戶-C,-check #測試此命令執行會改變什么內容,不會真正的去執行# ansible-doc詳細參數:ansible-doc -l #列出所有的模塊列表ansible-doc -s 模塊名 #查看指定模塊的參數 -s, snippet [?sn?p?t] 片斷
[root@manager~]# ansible-doc -s service#列出模塊使用簡介
[root@manager~]# ansible-doc -l # 指定一個模塊詳細說明
[root@ansible_server~]# ansible-doc -s fetch # 查詢模塊在劇本中應用方法
[root@manager~]# ansible-doc fetch
3. Ansible Inventory 主機清單文件
Ansible Inventory
指的是ansible管理的主機的列表,即主機清單。
ansible默認讀取/etc/ansible/hosts
文件,也可以修改路徑(用ansible -i
指定)
3.1 設置Inventory
- 指明主機的方式:
- 直接指明主機ip或域名
- 定義主機組再加入
#設置Inventory
[root@manager ~]# vim /etc/ansible/hosts
[front]
192.168.100.148[storage]
192.168.100.150[backup]
192.168.100.149
...#測試,對Inventory的所有主機ping測試
[root@manager ~]# ansible all -m ping
192.168.100.148 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}
192.168.100.149 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.149 port 22: No route to host","unreachable": true
}
...
3.2.1 子組
對于多個不同的組,創建一個聚合的組,便于一次對多組執行操作。
創建組data,包含storage和backup
ansible data -m ping
#在/etc/ansible/hosts中添加
[data:children]
storage
backup#測試(測試主機未開機)
ansible data -m ping
192.168.100.149 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.149 port 22: No route to host","unreachable": true
}
192.168.100.150 | UNREACHABLE! => {"changed": false,"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.100.150 port 22: No route to host","unreachable": true
}
3.2.2 指定ansible用戶、密碼、端口(不推薦)
前文提到,ansible是基于ssh控制Inventory中的主機的。我之前的文章已經寫過如何配置ssh密鑰認證
。
但若沒有配置,也可以在Inventory中指定ansible使用的用戶、密碼以及ssh的端口。
推薦設置ssh密鑰登錄
#/etc/ansible/hosts中的內容
[front]
192.168.100.148 ansible_user=root ansible_password=Huawei@123 ansible_port=22[storage]
192.168.100.150 ansible_user=root ansible_password=Huawei@123 ansible_port=22[backup]
192.168.100.149 ansible_user=root ansible_password=Huawei@123 ansible_port=22#測試
#若報錯,為ssh: Permission denied (publickey.password)。即無密碼。
192.168.100.148 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"},"changed": false,"ping": "pong"
}