ansible之基本原理及命令
什麼是ansible
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(\(puppet、chef、func、fabric\))的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。
ansible是基於 paramiko 開發的,並且基於模組化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所執行的模組,ansible只是提供一種框架。ansible不需要在遠端主機上安client/agents,因為它們是基於ssh來和遠端主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
特點
- 1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
- 2、預設使用SSH協議對裝置進行管理;
- 3、有大量常規運維操作模組,可實現日常絕大部分操作。
- 4、配置簡單、功能強大、擴充套件性強;
- 5、支援API及自定義模組,可通過Python輕鬆擴充套件;
- 6、通過Playbooks來定製強大的配置、狀態管理;
- 7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
- 8、提供一個功能強大、操作性強的Web管理介面和REST API介面——AWX平臺。
ansible安裝方式
ansible安裝常用兩種方式,yum安裝
pip程式安裝
這裡提供二種安裝方式,任選一種即可
1> 使用yum安裝
yum install epel-release -y
yum install ansible –y
2 >使用pip(python的包管理模組) 安裝
pip install ansible
如果沒pip,需先安裝pip.yum可直接安裝:
yum install python-pip
pip install ansible
我採用的是yum方式
安裝
ansible架構
Ansible
:Ansible核心程式。
HostInventory
:記錄由Ansible管理的主機資訊,包括埠、密碼、ip等。
Playbooks
CoreModules
:核心模組,主要操作是通過呼叫核心模組來完成管理任務。CustomModules
:自定義模組,完成核心模組無法完成的功能,支援多種語言。ConnectionPlugins
:連線外掛,Ansible和Host通訊使用
ansible任務執行模式
Ansible系統由控制主機對被管節點的操作方式可分為兩類, 即adhoc
和playbook
:
ad-hoc
模式使用單個模組, 支援批量執行單條命令。 ad-hoc 命令是一種可以快速輸入的命令, 而且不需要儲存起來的命令。 就相當於bash中的一句話shell。
playbook
模式是Ansible主要管理方式, 也是Ansible功能強大的關鍵所在。 playbook通過多個task集合完成一類功能, 如Web服務的安裝部署、 資料庫伺服器的批量備份等。 可以簡單地把playbook理解為通過組合多條ad-hoc操作作的配置檔案。
ansible執行流程
簡單理解就是Ansible在執行時, 首先讀取ansible.cfg中的配置, 根據規則獲取Inventory中的管理主機列表, 並行的在這些主機中執行配置的任務, 最後等待執行返回的結果。
Ansiblie命令執行過程
- 1、 載入自己的配置檔案 預設/etc/ansible/ansible.cfg
- 2、 查詢對應的主機配置檔案, 找到要執行的主機或者組
- 3、 載入自己對應的模組檔案, 如command
- 4、 通過ansible將模組或命令生成對應的臨時py檔案, 並將該檔案傳輸至遠端伺服器的
- 5、 對應執行使用者的家目錄的.ansible/tmp/XXX/XXX.PY檔案
- 6、 給檔案+x執行
- 7、 執行並返回結果
- 8、 刪除臨時py檔案, sleep 0退出
ansible程式結構
安裝目錄
配置檔案目錄:/etc/ansible/
執行檔案目錄:/usr/bin/
Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help文件目錄:/usr/share/doc/ansible-X.X.X/
Man文件目錄:/usr/share/man/man1/
Ansible配置檔案
ansible.cfg的配置
設定ansible.cfg
配置引數,ansible有許多引數,下面列出常用的引數:
inventory
:
這個引數表示資源清單inventory檔案的位置,資源清單就是一些Ansible需要連線管理的主 機列表。這個引數的配置例項如下:inventory = /etc/ansible/hosts
library
:
Ansible的操作動作,無論是本地或遠端,都使用一小段程式碼來執行,這小段程式碼稱為模組,這個library引數就是指向存放Ansible模組的目錄。配置例項如下:library = /usr/share/ansible
Ansible支援多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位
置下的./library目錄。
forks
:
設定預設情況下Ansible最多能有多少個程序同時工作, 從Ansible 1.3開始,fork數量預設自動設定為主機數量或者潛在的主機數量,預設設定最多5個程序並行處理。具體需要設定多少個,可以根據控制主機的效能和被管節點的數量來確定,可能是 50或100。預設值5是非常保守的值,配置例項如下:forks = 5
sudo_user
:
這是設定預設執行命令的使用者,也可以在playbook中重新設定這個引數。配置例項如下:sudo_user = root
remote_port
:
這是指定連線被管節點的管理埠,預設是22。除非設定了特殊的SSH埠,不然這個引數一般是 不需要修改的。配置例項如下:remote_port = 22
host_key_checking
:
這是設定是否檢查SSH主機的金鑰。可以設定為True或False,關閉後第一次連線沒有提示配置例項
host_key_checking = False
timeout
:
這是設定SSH連線的超時間隔,單位是秒。配置例項如下:timeout = 60
log_path
:
Ansible系統預設是不記錄日誌的,如果想把Ansible系統的輸出記錄到日誌檔案中,需要設定log_path來指定一個儲存Ansible日誌的檔案。配置例項如下:log_path = /var/log/ansible.log
另外需要注意,執行Ansible的使用者需要有寫入日誌的許可權,模組將會呼叫被管節點的syslog來記錄
hosts的配置
1、 直接指明主機地址或主機名:
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
2、 定義一個主機組[組名]把地址或主機名加進去
[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153
組成員可以使用萬用字元來匹配, 如下 192.168.2.[1:6]
:表示匹配從192.168.2.1——192.168.2.6的主機
Ansible的命令
/usr/bin/ansible
# Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命令的執行
/usr/bin/ansible-doc
# Ansible 模組功能檢視工具
/usr/bin/ansible-galaxy
# 下載/上傳優秀程式碼或Roles模組 的官網平臺,基於網路的
/usr/bin/ansible-playbook
# Ansible 定製自動化的任務集編排工具
/usr/bin/ansible-pull
# Ansible遠端執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)
/usr/bin/ansible-vault
# Ansible 檔案加密工具
/usr/bin/ansible-console
# Ansible基於Linux Consoble介面可與使用者互動的命令執行工具
Ansible-doc命令
命令:ansible-doc
引數:
-h
, --help show this help message and exit # 顯示命令引數API文件-l
, --list List available modules #列出可用的模組-M MODULE_PATH
, --module-path=MODULE_PATH #指定模組的路徑specify path(s) to module library (default=None)-s
, --snippet Show playbook snippet for specified module(s) #顯示playbook制定模組的用法--version
show program's version number and exit # 顯示ansible-doc的版本號檢視模組列表:
一般用法:
ansible-doc -l
獲取模組資訊
ansible-doc -s MOD_NAME
獲取指定模組的使用幫助
Ansible命令詳解
命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
我們可以通過 ansible -h檢視幫助
-a MODULE_ARGS
, --args=MODULE_ARGS 模組的引數,如果執行預設COMMAND的模組, 即是命令引數,如: “date”,“pwd”等等 module arguments 模組引數
-k
, --ask-pass ask for SSH password 登入密碼, 提示輸入SSH密碼而不是假設基於金鑰的驗證
--ask-su-pass
ask for su password su切換密碼
-K
, --ask-sudo-pass ask for sudo password 提示密碼使用sudo,sudo表示提權操作
--ask-vault-pass
ask for vault password
-B SECONDS
, --background=SECONDS 後臺執行超時時間
run asynchronously, failing after X seconds (default=N/A)
-C
, --check don‘t make any changes; instead, try to predict some of the changes that may occur
只是測試一下會改變什麼內容, 不會真正去執行;相反,試圖預測一些可能發生的變化
-c CONNECTION
, --connection=CONNECTION 連線型別使用 connection type to use (default=smart)
-f FORKS, --forks=FORKS
並行任務數。NUM被指定為一個整數,預設是5
-i INVENTORY, --inventory-file=INVENTORY
指定庫存主機檔案的路徑,預設為/etc/ansible/hosts
--list-hosts
outputs a list of matching hosts; does not execute anything else
-m MODULE_NAME, --module-name=MODULE_NAME
執行模組的名字,預設使用 command 模組,所以如果是隻執行單一命令可以不用 -m引數module name to execute (default=command)
-M MODULE_PATH, --module-path=MODULE_PATH
要執行的模組的路徑,預設為/usr/share/ansible/
-o, --one-line
condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL
調查背景工作每隔數秒。需要- b
--private-key=PRIVATE_KEY_FILE
私鑰路徑,使用這個檔案來驗證連線
-S
, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER
指定SU的使用者,預設是root使用者
-s
, --sudo run operations with sudo (nopasswd)
-U SUDO_USER, --sudo-user=SUDO_USER
sudo到哪個使用者,預設為 root
-T TIMEOUT, --timeout=TIMEOUT
指定SSH預設超時時間, 預設是10S
-t TREE, --tree=TREE
log output to this directory 將日誌內容儲存在該輸出目錄,結果儲存在一個檔案中在每臺主機上。
-u REMOTE_USER, --user=REMOTE_USER
遠端使用者, 預設是root使用者
--vault-password-file=VAULT_PASSWORD_FILE
vault password file
-v
, --verbose verbose mode (-vvv for more, -vvvv to enable 詳細資訊