Ansible 是一種自動化運維工具,基於 Paramiko 開發的,並且基於模塊化工作,Ansible 是一種集成 IT 系統的配置管理、應用部署、執行特定任務的開源平臺,它是基於 Python 語言,由 Paramiko 和 PyYAML 兩個關鍵模塊構建。集合了眾多運維工具的優點,實現了批量系... ...
2)Ansible 介紹
Ansible 基本概念
Ansible 是一種自動化運維工具,基於 Paramiko 開發的,並且基於模塊化工作,Ansible 是一種集成 IT 系統的配置管理、應用部署、執行特定任務的開源平臺,它是基於 Python 語言,由 Paramiko 和 PyYAML 兩個關鍵模塊構建。集合了眾多運維工具的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。
Ansible 是基於模塊工作的,本身沒有批量部署的能力,真正具有批量部署的是 Ansible 所運行的模塊,Ansible 只是提供一種框架。Ansible 不需要在遠程主機上安裝 Client、Agents,因為它們是基於 SSH 來和遠程主機通訊的。
Ansible 優勢
- Ansible 不需要單獨安裝客戶端,也不需要啟動任何服務
- Ansible 是 Python 中的一套完整的自動化執行任務模塊
- Ansible PlayBook,採用 yaml 配置,對於自動化任務執行一目瞭然
- Ansible 模塊較多,對於自動化的場景支持較豐富
2.1)Ansible 發展史
官網:https://www.ansible.com/
作者: Michael DeHaan( Cobbler 與 Func 作者)
Ansible 的名稱來自科幻小說《 安德的游戲 》中跨越時空的即時通信工具,使用它可以在相距數光年的距離,遠程實時控制前線的艦隊戰鬥。
2012-03-09,發佈 0.0.1 版
2015-10-17,Red Hat 宣佈 1.5 億美元收購
官方文檔:https://docs.ansible.com/
2.2)Ansible 功能
Ansible 功能介紹
- 批量執行遠程命令,可以對遠程的多台主機同時進行命令的執行
- 批量安裝和配置軟體服務,可以對遠程的多台主機進行自動化的方式配置和管理各種服務
- 編排高級的企業級複雜的 IT 架構任務,Ansible 的 PlayBook 和 Role 可以輕鬆實現大型的 IT 複雜架構
- 提供自動化運維工具的 開發 API,有很多運維工具,如 JumpServer 就是基於 Ansible 實現自動化管理功能
2.3)Ansible 特性
Ansible 特性
- 模塊化: 調用特定的模塊完成特定任務,支持自定義模塊,可使用任何編程語言寫模塊
- Paramiko( Python 對 SSH 的實現),PyYAML,Jinja2(模板語言)三個關鍵模塊
- 基於 Python 語言實現
- 部署簡單,基於 Python 和 SSH (預設已安裝),agentless,無需代理不依賴 PKI( 無需 SSL )
- 安全, 基於 OpenSSH
- 冪等性: 一個任務執行 1 遍和執行 n 遍效果一樣,不因重覆執行帶來意外情況,此特性非絕對。( Shell 腳本想實現冪等性很困難 )
- 支持 PlayBook 編排任務,YAML 格式,編排任務,支持豐富的數據結構( 存在 分支,迴圈,判斷,變數 等功能 )
- 較強大的 多層解決方案 role( Role 角色管理 )
2.4)Ansible 架構
Ansible 是 基於模塊工作 的,本身沒有批量部署的能力。真正具有批量部署的是 Ansible 所運行的模塊,Ansible 只是提供一種框架。
上圖為 Ansible 的基本架構,從上圖可以瞭解到其由以下部分組成:
- 核心: Ansible
- 核心模塊(Core Modules):這些都是 Ansible 自帶的模塊
- 擴展模塊(Custom Modules):如果核心模塊不足以完成某種功能,可以添加擴展模塊
- 插件(Plugins):完成模塊功能的補充
- 劇本(Playbooks):Ansible 的任務配置文件,將多個任務定義在劇本中,由 Ansible 完成執行
- 連接插件(Connectior Plugins):Ansible 基於連接插件連接到各個主機上,雖然 Ansible 是使用 SSH 連接到各個主機的,但是它還支持其他的連接方法,所以需要有連接插件
- 主機清單(Host Inventory):定義 Ansible 管理的主機
Ansible 工作邏輯
- 用戶請求
- 尋找要運行的主機清單
- 通過模塊連接遠程主機發送要執行的命令
- 被控節點執行命令
2.4.1)Ansible 組成
組合 INVENTORY、API、MODULES、PLUGINS 的綠框
為 Ansible 命令工具,其為 核心執行工具
INVENTORY:Ansible 管理主機的清單 /etc/anaible/hosts ( 主機清單 )
MODULES:Ansible 執行命令的 功能模塊,多數為內置核心模塊,也可自定義( 功能模塊 )
PLUGINS:模塊功能的補充,如 連接類型插件、迴圈插件、變數插件、過濾插件等,該功能不常用( 擴展插件 )
API:**供第三方程式調用 **的應用程式編程介面( 開發介面 )
2.4.2)Ansible 命令執行來源
USER 用戶,即 SYSTEM ADMINISTRATOR
PLAYBOOKS:任務劇本(任務集),編排定義 Ansible 任務集的配置文件,由 Ansible 順序依次執行,通常是 JSON 格式的 YML 文件
CMDB(配置管理資料庫) API 調用
PUBLIC/PRIVATE CLOUD( 共有雲\私有雲 )API 調用
USER -> Ansible Playbook -> Ansibile
2.4.3)註意事項
執行 Ansible 的主機 一般稱為:管理端,主控端,中控,Master 或 堡壘機
主控端 Python 版本需要 2.6 或以上
被控端 Python 版本小於 **2.4 **時,需要安裝 Python-simplejson
被控端 如開啟 SELinux 需要安裝 libselinux-python
Windows 不能做為主控端( 可以做被控端 )
3)Ansible 入門
3.1)Ansible 安裝
官方文檔:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
Ansible 的安裝方法有多種
- Yum 源安裝
- 編譯安裝
- Git 方式
- PIP 安裝
3.1.1)Yum 源安裝
註意:Ansible 軟體包預設不在 Yum 倉庫中,需配置 EPEL 源安裝。
https://blog.csdn.net/weixin_74962223/article/details/134573366
// CentOS 的 EPEL 源的 rpm 包安裝
[root@centos7 ~] yum repolist | grep epel
[root@centos7 ~] yum install ansible -y
// Ubuntu 安裝
[root@ubuntu ~] apt install ansible -y
範例:查看 Ansible 版本
[root@centos7 ~] yum info ansible
[root@centos8 ~] yum info ansible
[root@ubuntu1804 ~] apt show ansible
範例:Ubuntu18.04 安裝最新版的 Ansible
[root@ubuntu1804 ~] apt update
[root@ubuntu1804 ~] apt install software-properties-common
[root@ubuntu1804 ~] apt-add-repository --yes --update ppa:ansible/ansible
[root@ubuntu1804 ~] apt install ansible
[root@ubuntu1804 ~] ansible --version
範例: CentOS 安裝 Ansible
# 需要存在 EPEL 源
# 參考: https://blog.csdn.net/weixin_74962223/article/details/134573366
[root@centos7 ~] yum repolist
[root@centos7 ~] yum install ansible -y
[root@centos7 ~] ansible --version
3.1.2)編譯安裝
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz
tar xf ansible-1.5.4.tar.gz
&& cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
3.1.3)Git 方式
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
3.1.4)PIP 安裝
# PIP 是安裝 Python 包的管理器, 類似 Yum
[root@centos7 ~] yum install python-pip
[root@centos7 ~] pip install --upgrade pip
[root@centos7 ~] pip install ansible --upgrade
[root@centos7 ~] ansible --version
3.1.5)驗證安裝
[root@ansible ~] ansible --version
ansible 2.9.27 # 版本信息
config file = /etc/ansible/ansible.cfg # 配置文件
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] # 模塊路徑
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible # ansible 可執行程式 ( 基於 Python 編寫 )
python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
3.2)Ansible 相關文件
3.2.1)配置文件
Ansible 是一款自動化運維工具,它並不是一個服務。
因此,它沒有對應的 Service 文件。Ansible 無需長期運行,只在需要使用時運行其二進位文件即可。( 安裝完成後,直接使用即可 )
/etc/ansible/ansible.cfg
主配置文件
配置 ansible 工作特性,也可以在項目的目錄中創建此文件,
當前目錄下如果也有 ansible.cfg,則此文件優先生效,建議每個項目目錄下,創建獨有的 ansible.cfg 文件
/etc/ansible/hosts
主機清單
/etc/ansible/roles
存放角色的目錄
3.2.2)Ansible 主配置文件
Ansible 的配置文件 可以放在多個不同地方
優先順序從高到低順序如下
ansible will read ANSIBLE_CONFIG,ansible.cfg in the current working directory, .ansible.cfg in the home directory or /etc/ansible/ansible.cfg, whichever it finds first
a. $ANSIBLE_CONFIG 變數
b. 項目目錄下的配置文件
c. 當前用戶家目錄下的配置文件
d. /etc/ansible/ansible.cfg (預設)
# 驗證 Ansible 預設調用的主配置文件路徑
ansible --version # 當前目錄的 ansible 配置文件調用優先順序高於 /etc/ansible/xxx
Ansible 的 預設配置文件 /etc/ansible/ansible.cfg
其中大部分的配置內容無需進行修改( 下圖:RHCE 考試預設使用的 ansible.cfg )
[defaults]
# inventory = /etc/ansible/hosts // 主機列表配置文件
# library = /usr/share/my_modules // 庫文件存放目錄
# remote_tmp = $HOME/.ansible/tmp // 臨時py命令文件存放在遠程主機目錄
# local_tmp = $HOME/.ansible/tmp // 本機的臨時命令執行目錄
# forks = 5 // 預設併發數
# sudo_user = root // 預設 sudo 用戶
# ask_sudo_pass = True // 每次執行 ansible 命令是否詢問 ssh 密碼
# ask_pass = True
# remote_port = 22
# host_key_checking = False // 檢查對應伺服器的 host_key, 建議取消此行註釋, 實現第一次連接自動信任目標主機
# log_path=/var/log/ansible.log // 日誌文件, 建議啟用
# module_name = command // 預設模塊, 可以修改為 shell 模塊
[privilege_escalation] # 如果是普通用戶則需要配置提權
# become=True
# become_method=sudo
# become_user=root
# become_ask_pass=False
小技巧:當前目錄下的 Ansible 的配置文件 優先生效
// 驗證 Ansible
[root@ansible ~] ansible --version
// 複製 Ansible 配置文件至當前目錄
[root@ansible ~] cp /etc/ansible/ansible.cfg .
// 再次驗證
[root@ansible ~] ansible --version
ansible 2.9.17
config file = /root/ansible.cfg # 註意配置文件路徑優先順序為當前目錄的 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, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
3.2.3)inventory 主機清單
官方文檔:https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html
Ansible 的主要功能 在於批量主機操作,為了便捷地使用其中的部分主機,可以在 Inventory 主機清單文件中將其分組組織。
預設的 inventory file 為 /etc/ansible/hosts
當然也可以自定義,然後使用 -i 指定 inventory 文件位置
註意: 生產環境建議在每個項目目錄下創建項目獨立的 hosts 文件
主機清單 文件格式
inventory 文件遵循 INI 文件風格
中括弧中的字元為組名。可以將同一個主機同時歸併到多個不同的組中
此外,當如若目標主機使用了非預設的 SSH 埠,還可以在主機名稱之後使用冒號加埠號來標明
如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機
Inventory 參數說明
ansible_ssh_host // 將要連接的遠程主機名. 與你想要設定的主機的別名不同的話, 可通過此變數設置.
ansible_ssh_port // ssh 埠號. 如果不是預設的埠號, 通過此變數設置. 這種可以使用 ip:埠 192.168.1.100:2222
ansible_ssh_user // 預設的 ssh 用戶名
ansible_ssh_pass // ssh 密碼 ( 這種方式並不安全, 我們強烈建議使用 --ask-pass 或 SSH 密鑰 )
ansible_sudo_pass // sudo 密碼 (這種方式並不安全, 我們強烈建議使用 --ask-sudo-pass )
ansible_sudo_exe (new in version 1.8) // sudo 命令路徑 ( 適用於1.8及以上版本 )
ansible_connection // 與主機的連接類型. 比如: local, ssh 或者 paramiko. Ansible 1.2 以前預設使用 paramiko.1.2 以後預設使用 'smart', 'smart' 方式會根據是否支持 ControlPersist, 來判斷'ssh' 方式是否可行.
ansible_ssh_private_key_file // ssh 使用的私鑰文件. 適用於有多個密鑰, 而你不想使用 SSH 代理的情況.
ansible_shell_type // 目標系統的 shell 類型. 預設情況下, 命令的執行使用 'sh' 語法, 可設置為 'csh' 或 'fish'.
ansible_python_interpreter // 目標主機的 python 路徑.
範例:列表形式
# vim /etc/ansible/hosts ( 預設主機清單文件 )
ntp.magedu.com # 1) 被管理主機名或 IP 地址
[webservers] # 2) 將被管理主機分類
www1.magedu.com:2222 # 3) 目標主機使用了非預設的 SSH 埠
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
或者
db[1:3].magedu.com # 4) 可以使用列表的方式標識主機
範例:組嵌套
# vim /etc/ansible/hosts ( 預設主機清單文件 )
[webservers]
www[1:100].example.com
[dbservers]
db-[a:f].example.com
[appservers]
10.0.0.[1:100] # 列表形式: 10.0.0.1 - 10.0.0.100
// 定義 testsrvs 組包括兩個其它分組, "實現組嵌套"
[testsrvs:children]
webservers
dbservers
範例:
本機地址: 10.0.0.8
# vim /etc/ansible/hosts ( 預設主機清單文件 )
[local]
10.0.0.8 ansible_connection=local # 指定本地連接, 無需 ssh 配置
# 註意: ansible_connection=ssh 時
# 配置文件需要 StrictHostKeyChecking no
[websrvs] # 也可以在被控主機行添加如下信息 ( 不推薦, 會暴露主機安全 )
10.0.0.7 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=wang ansible_ssh_password=magedu
10.0.0.6 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_password=123456
# 執行 ansible 命令時顯示別名, 如 web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102
# 僅填寫主機 IP 地址也可以
[websrvs]
10.0.0.7
10.0.0.17
---
[websrvs:vars]
ansible_ssh_password=magedu
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
總結:
- 主機支持主機名通配以及正則表達式,例如 web[1:3].magedu.com 代表三台主機
- 主機支持基於非標準的 SSH 埠,例如 web1.magedu.com:6666
- 主機支持指定變數,可對個別主機的特殊配置,如登陸用戶,密碼
- 主機組支持指定變數 [group_name:vars],同時支持嵌套組 [game:children]
3.3)Ansible 相關工具
- /usr/bin/ansible 主程式,臨時命令執行工具
- /usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具,相當於 man
- /usr/bin/ansible-playbook 定製自動化任務,編排劇本工具,相當於腳本
- /usr/bin/ansible-pull 遠程執行命令的工具
- /usr/bin/ansible-vault 文件加密工具( RHCE 有考該工具的使用 )
- /usr/bin/ansible-console 基於 Console 界面與用戶交互的執行工具
- /usr/bin/ansible-galaxy 下載/上傳優秀代碼或 Roles 模塊的官網平臺
利用 Ansible 實現管理的主要方式:
Ansible Ad-Hoc:即利用 ansible 命令,主要用於臨時命令使用場景
Ansible PlayBook:主要用於長期規劃好的,大型項目的場景,需要有前期的規划過程
ansible 使用前 準備工作( 建議 )
Ansible 相關工具大多數是 通過 SSH 協議,實現對遠程主機的配置管理、應用部署、任務執行等功能
建議: 使用此工具前,先配置 ansible 主控端能基於密鑰認證的方式聯繫各個被管理節點
# 解決: 遠程被控端主機是, 自動回覆 yes 選項
# 第一次遠程連接某個主機時, 對方主機會預設詢問你是否 xxx, 輸入 yes 後, 預設會將遠程主機公鑰寫入本機 known_hosts
1) 修改 SSH 客戶端配置文件
vim /etc/ssh/ssh_config
StrictHostKeyChecking no // "自動回覆 yes 選項"
# 驗證 known_hosts 文件
cat ~/.ssh/known_hosts
2) 或者, 修改 Ansible 配置文件
vim /etc/ansible/ansible.cfg
host_key_checking = False // "建議取消該行註釋"
// 基於密碼認證 ( "不常用" )
# 註意: websrvs 組的所有主機密碼 必須都是 redhat
# 如果 websrvs 組的某個主機密碼不是 redhat, 則無法連接成功
# 因此推薦使用 Key 認證 !!!
ansible websrvs -m ping -k
SSH password: redhat
範例: 利用 sshpass 批量實現基於 key 驗證腳本 1
這個腳本的作用是批量向指定的 IP 地址列表傳送 SSH 公鑰,並且在執行過程中忽略對遠程主機主機密鑰的嚴格檢查。
// 修改下麵一行 ( 允許連接新的主機時,不需要手動確認密鑰 )
[root@centos8 ~] vim /etc/ssh/ssh_config
StrictHostKeyChecking no
[root@centos8 ~] vim push_ssh_key.sh
#!/bin/bash
IPLIST="
192.168.80.8
192.168.80.18
192.168.80.28"
rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -P '' export SSHPASS=redhat # 主機密碼
for IP in $IPLIST;do
{
sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP
}&
done
wait
範例: 實現基於 key 驗證的腳本 2
這段腳本主要用於 在區域網中掃描活動的主機,然後通過 SSH 在這些主機之間傳遞 SSH 密鑰 以便後續相互訪問時不需要手動確認密鑰
註意: 該腳本會實現主機之間相互免密認證
#!/bin/bash
PASS=redhat # 主機密碼
# 設置網段最後的地址, 4-255 之間, 越小掃描越快
END=254
IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'` # 註意網卡名稱
NET=${IP%.*}.
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
# 把 .ssh/known_hosts 拷貝到所有主機, 使它們第一次互相訪問時不需要輸入回車
for n in ${AliveIP[*]};do
scp /root/.ssh/known_hosts ${n}:.ssh/
done
[root@centos7 ~] bash push_ssh_key.sh
推薦:使用該腳本
< '批量部署多台主機 基於 key 驗證腳本' >
[root@ansible ~] vim push_ssh_key.sh
#!/bin/bash
HOSTS="
192.168.80.8
192.168.80.18
192.168.80.28
"
PASS=redhat # 註意: 密碼
[ -f /root/.ssh/id_rsa ] ||
ssh-keygen -P "" -f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in $HOSTS;do
{
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i &> /dev/null
}&
done
wait
Ansible 命令 參數示範
# 列出 Ansible 可控制的所有主機
ansible all --list-hosts
# 列出 Ansible 可控制的 websrvs 組主機
ansible websrvs --list-hosts
// 演示: 通配符
ansible "*" -m ping
ansible 192.168.80.* -m ping
ansible "192.168.80.8 192.168.80.18" -m ping
# Ping 模塊: 測試與目標主機的連通性 ( 註意: 該 Ping 模塊並沒有走 ICMP 協議 )
# -m 指定模塊
# ping 模塊
ansible all -m ping
3.3.1)ansible-doc
此工具用來 顯示模塊的幫助,相當於 man
// 格式
ansible-doc [options] [module...]
-l, --list // 列出可用模塊
-s, --snippet // 顯示指定模塊的 playbook 片段
// 查看幫助
[root@ansible ~] ansible-doc --help
範例:
// 列出所有模塊
ansible-doc -l
// 查看指定模塊幫助用法 ( 詳細說明 )
ansible-doc ping
// 查看指定模塊幫助用法 ( 簡單說明 )
ansible-doc -s ping
ansible-doc -l | grep ^ping
// "重要"
// 查看模塊的 "使用案例"
ansible-doc ping | grep -A 100 EXA
ansible-doc file | grep -A 100 EXA
註意點
ansible-doc file
ansible-doc file | grep ^=
眼尖的小伙伴們可能會發現,上述操作其實可以通過 Linux 的 chown 命令來實現。但為什麼我們不直接使用 chown,而要藉助 Ansible 的 file 模塊呢?這主要是因為 Shell 命令不具備冪等性,而 Ansible 的大部分模塊都支持冪等性。這使得使用 Ansible 的 file 模塊更加安全可靠。
範例: 查看指定的插件
[root@ansible ~] ansible-doc -t connection -l
[root@ansible ~] ansible-doc -t lookup -l
3.3.2)ansible Ad-Hoc
Ansible 的執行方式的主要工具就是 ansible( 專業名詞:Ad-Hoc )
用於執行一次性的任務,臨時任務。
# 格式
ansible <host-pattern> [-m module_name] [-a args]
# 特殊案例 ( localhost: 代表本機)
ansible localhost -m ping
# 常規案例 ( websrvs: 主機清單中的分組信息 )
ansible websrvs -m ping
**
選項說明:
ansible 'oldboy' -m command -a 'df -h' 含義如下圖
--version # 顯示版本
-m module # 指定模塊,預設為 command
-v # 詳細過程 -vv -vvv 更詳細
--list-hosts # 顯示主機列表, 可簡寫 --list
-C, --check # 檢查, 並不執行
-T, --timeout=TIMEOUT # 執行命令的超時時間, 預設 10S
-k, --ask-pass # 提示輸入 ssh 連接密碼, 預設 Key 驗證
-u, --user=REMOTE_USER # 執行遠程執行的用戶, 預設 root
-b, --become # 代替舊版的 sudo 切換
--become-user=USERNAME # 指定 sudo 的 runas 用戶, 預設為 root
-K, --ask-become-pass # 提示輸入 sudo 時的口令
-f FORKS, --forks FORKS # 指定併發同時執行 ansible 任務的主機數
顯示詳細過程
ansible websrvs -m ping -v
ansible websrvs -m ping -vv
ansible websrvs -m ping -vvv
案例: 使用 普通用戶 身份 提升許可權 操作 遠程主機
# 先在被控制端 授權普通用戶 sudo 許可權
[root@centos8 ~] useradd wangj
[root@centos8 ~] echo 123456 | passwd --stdin wangj
[root@centos8 ~] vim /etc/sudoers
wangj ALL=(ALL) NOPASSWD: ALL
# 以 wangj 普通用戶身份連接主機, 並利用 sudo 授權 root 許可權執行 whoami 命令
[root@ansible ~] ansible 192.168.80.8 -m shell -a 'whoami' -u wangj -k -b --become-user=root
SSH password: // 輸入遠程主機 wangj 用戶 ssh 連接密碼
10.0.0.8 | CHANGED | rc=0 >>
root
Ansible 的 Host-pattern
用於匹配被控制的主機列表
All:表示所有 Inventory 中的所有主機
ansible all -m ping
*:通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping
或 關係
# websrvs 或 dbsrvs 主機
ansible "websrvs:dbsrvs" -m ping
# 192.168.80.18 或 192.168.80.28 主機
ansible "192.168.80.18:192.168.80.28" -m ping
邏輯 與
// 在 websrvs 組並且在 dbsrvs 組中的主機
ansible "websrvs:&dbsrvs" -m ping
邏輯 非
// 在 websrvs 組, 但不在 dbsrvs 組中的主機
// 註意: 此處為單引號
ansible 'websrvs:!dbsrvs' -m ping
綜合 邏輯
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
正則 表達式
ansible "websrvs:dbsrvs" -m ping
ansible "~(web|db).*\.magedu\.com" -m ping
舉例:
// 重啟所有以 "kube" 開頭 或 "etcd" 開頭, 且不是 10.0.0.101 的主機
// 一般 10.0.0.101 為本機 IP 地址.
[root@kube-master1 ~] ansible 'kube*:etcd:!10.0.0.101' -a reboot && reboot
範例:
[root@centos8 ~] ansible all --list-hosts
hosts (3):
10.0.0.6
10.0.0.7
10.0.0.8
[root@centos8 ~] ansible websrvs --list-hosts
hosts (3):
10.0.0.6
10.0.0.7
10.0.0.8
[root@centos8 ~] ansible appsrvs --list-hosts
hosts (2):
10.0.0.7
10.0.0.8
// 使用 雙引號 或者 單引號 都可以
[root@centos8 ~] ansible "appsrvs:dbsrvs" --list-hosts
[root@centos8 ~] ansible 'appsrvs:dbsrvs' --list-hosts
hosts (3):
10.0.0.7
10.0.0.8
10.0.0.6
[root@centos8 ~] ansible "dbsrvs" --list-hosts
[root@centos8 ~] ansible 'dbsrvs' --list-hosts
hosts (2):
10.0.0.6
10.0.0.7
[root@centos8 ~] ansible appsrvs --list-hosts
hosts (2):
10.0.0.7
10.0.0.8
[root@centos8 ~] ansible "appsrvs:dbsrvs" --list-hosts
hosts (3):
10.0.0.7
10.0.0.8
10.0.0.6
[root@centos8 ~] ansible "appsrvs:&dbsrvs" --list-hosts
hosts (1):
10.0.0.7
// 註意: 引用 ! 號時, "不要用雙引號"
[root@centos8 ~] ansible "appsrvs:!dbsrvs" --list-hosts
-bash: !dbsrvs: event not found
// "而使用單引號"
[root@centos8 ~] ansible 'appsrvs:!dbsrvs' --list-hosts
hosts (1):
10.0.0.8
範例:Ansible 執行 併發控制
GIF 錄製工具:https://www.cockos.com/licecap/
// 分別執行下麵兩條命令觀察結果
[root@ansible ~] ansible all -a 'sleep 1' -f1 # 單台單台 執行任務
[root@ansible ~] ansible all -a 'sleep 1' -f10 # 一次性 執行任務
Ansible 命令執行過程
參考:https://www.liushuang6296.com/posts/a71433d/
- 載入預設配置文件 /etc/ansible/ansible.cfg。
- 載入相應的模塊,例如 command 模塊。
- Ansible 生成臨時 Python 文件,並傳輸到遠程伺服器的 $HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY。
- 為文件添加執行許可權。
- 執行文件並返回結果。
- 刪除臨時文件並退出。
// 演示
[root@ansible ~] ansible all -m shell -a 'sleep 100'
// 驗證 ( 臨時 Python 文件 )
[root@centos8 ~] ll ~/.ansible/tmp/*
Ansible 的執行狀態:
[root@centos8 ~] grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
[colors]
# highlight = white
# verbose = blue
# warn = bright purple
# error = red
# debug = dark gray
# deprecate = purple
# skip = cyan
# unreachable = red
# ok = green
# changed = yellow
# diff_add = green
# diff_remove = red
# diff_lines = cyan
Ansible 執行返回 -> 顏色信息說明:
綠色: 成功執行,沒有發生狀態改變
黃色: 成功執行,有發生狀態改變
紅色: 執行失敗
Ansible 使用範例
# 以 wang 用戶執行 ping 存活檢測
ansible all -m ping -u wang -k
# 以 wang sudo 至 root 執行 ping 存活檢測
ansible all -m ping -u wang -k -b
# 以 wang sudo 至 mage 用戶執行 ping 存活檢測
ansible all -m ping -u wang -k -b --become-user=mage
# 以 wang sudo 至 root 用戶執行 ls
ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -K
使用示範
// 單台主機 10.0.0.7
ansible 10.0.0.7 -m ping
// websrvs 組
ansible websrvs -m ping
3.3.3)ansible-console
此工具可交互執行命令,支持 tab,ansible 2.0+ 新增
提示符格式:
執行用戶@當前操作的主機組 (當前組的主機數量)[f:併發數]$
常用子命令:
- 設置併發數:forks n 例如: forks 10
- 切換組:cd 主機組 例如: cd web
- 列出當前組主機列表:list
- 列出所有的內置命令: ? 或 help
範例
ansible-console:可互動式執行 ansible 命令
[01:13:41 root@ansible ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
root@all (3)[f:5]$ ping
192.168.80.8 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.80.18 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.80.28 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
root@all (3)[f:5]$ list
192.168.80.8
192.168.80.18
192.168.80.28
root@all (3)[f:5]$ cd websrvs
root@websrvs (2)[f:5]$ list
192.168.80.18
192.168.80.28
root@websrvs (2)[f:5]$ forks 1
root@websrvs (2)[f:1]$ ping
192.168.80.18 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
192.168.80.28 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
3.3.4)ansible-playbook
此工具 用於執行編寫好的 PlayBook 任務
範例:
[root@ansible ~] vim hello.yml
---
# hello world yml file
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: hello world
command: /usr/bin/wall hello world
[root@ansible ~] ansible-playbook hello.yml
3.3.5)ansible-vault
此工具可以用於加密解密 yml 文件( RHCE 考試中存在該工具的考題 )
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
範例
ansible-vault encrypt hello.yml # 加密
ansible-vault decrypt hello.yml # 解密
ansible-vault view hello.yml # 查看
ansible-vault edit hello.yml # 編輯加密文件
ansible-vault rekey hello.yml # 修改口令
ansible-vault create new.yml # 創建新文件
3.3.6)ansible-galaxy
Galaxy 是一個免費網站,類似於 GitHub 網站,網站上發佈了很多的共用的 Roles 角色。
Ansible 提供了 ansible-galaxy 命令行工具連接 https://galaxy.ansible.com 網站下載相應的 Roles,進行 init (初始化)、search (查詢)、install (安裝)、 remove (移除)等操作。
範例:
# 搜索項目
[root@ansible ~] ansible-galaxy search lamp
# 列出所有已安裝的 galaxy
ansible-galaxy list
# 安裝 galaxy, 預設下載到 ~/.ansible/roles 下
ansible-galaxy install geerlingguy.mysql
ansible-galaxy install geerlingguy.redis
# 刪除 galaxy
ansible-galaxy remove geerlingguy.redis