Ansible 基礎入門

来源:https://www.cnblogs.com/wuhanjiayou/p/18060157/Ansible-Base
-Advertisement-
Play Games

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 工作邏輯

  1. 用戶請求
  2. 尋找要運行的主機清單
  3. 通過模塊連接遠程主機發送要執行的命令
  4. 被控節點執行命令

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 的安裝方法有多種

  1. Yum 源安裝
  2. 編譯安裝
  3. Git 方式
  4. 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

image.png

範例:

// 列出所有模塊
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' 含義如下圖
image.png

--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/

  1. 載入預設配置文件 /etc/ansible/ansible.cfg。
  2. 載入相應的模塊,例如 command 模塊。
  3. Ansible 生成臨時 Python 文件,並傳輸到遠程伺服器的 $HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY。
  4. 為文件添加執行許可權。
  5. 執行文件並返回結果。
  6. 刪除臨時文件並退出。

// 演示
[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

image.png

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 (移除)等操作。
image.png

範例:

# 搜索項目
[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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 蓬萊enclave-spmp 編譯和運行說明 蓬萊是一個RISC-V TEE系統,其設計具有安全性,高性能和可擴展性。基於PMP的OpenSBI版本的蓬萊Enclave使用可以參考下文,具體倉庫地址為:https://github.com/Penglai-Enclave/Penglai-Enclav ...
  • 一.找回root密碼 找到以““Linux16”開頭內容所在的行數”,在行的最後面輸入:init=/bin/sh 輸完紅色命令後 Ctrl + X 命令 接下來在游標閃爍處,輸入指令:mount -o remount,rw /(註意:各個單詞間有空格) 游標閃爍的位置中,輸入passwd,輸入一次密 ...
  • iptables是Linux系統上用於配置網路包過濾規則的工具,它使用表(tables)和鏈(chains)來組織規則。以下是iptables中的五表五鏈及其對應的實例說明: 五表 filter表:預設表,用於過濾數據包,允許或拒絕數據包通過。它包含INPUT、OUTPUT和FORWARD三個鏈。 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會造成IP CMD讀寫異常。 痞子衡曾經寫過一篇文章 《改動i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能會造成系統異常》,這篇文章提出了一個觀點,即對於 MCU ...
  • 1.Sed 工作流程 首先sed把當前正在處理的行保存在一個臨時緩存區中(也稱為模式空間),然後處理臨時緩衝區中的 行,完成後把該行發送到屏幕上。 sed把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原文件。 Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程式等。 ...
  • 目錄一.下載鏡像二.鏡像安裝三.繼續進行虛擬機設置四.虛擬機啟動設置一些供參考的視頻教程 一.下載鏡像 官網鏡像下載地址(需要開梯) 清華大學鏡像站地址 二.鏡像安裝 三.繼續進行虛擬機設置 四.虛擬機啟動設置 點擊虛擬機後滑鼠就不會出VMare,想要滑鼠返回個人的電腦,則按下Ctrl+Alt 一 ...
  • STM32F103xC,xD,xE引腳定義 由於在使用STM32系列晶元過程中發現互聯網沒有整理好的引腳定義,因此自己整理一份,方便以後查閱。 GPIOA Pin 重新上電時的功能 預設功能 重映射 PA0 PA0 WKUP/USART2_CTS/ADC123_IN0/TIM2_CH1_ETR/TI ...
  • STM32標準庫通用定時器PWM生成 1. 初始化 void TIM2_Init() // 定時器2初始化 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); // 使能定時器2的時鐘 RCC_APB2PeriphClockCmd(RCC_AP ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...