什么是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
:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
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 詳細信息