目錄
1、Ansible特性
模塊化:
- 調用特定的模塊,完成特定的任務
- 有paramiko、PyYAML、jinja2三個關鍵模塊
- 支持自定義模塊
- 基於python語言開發
- 部署簡單就要python和ssh,agentless
- 安全,基於Openssh
- 支持playbook編排任務
- 冪等性:一個任務執行一遍和執行n遍效果一樣,不會因為重復執行帶來意外情況
- 無序代理不依賴PKI(無需ssl)
- 可使用認可編程語言編寫模塊
- YAML格式編排任務,支持豐富的數據結構
- 叫強大的多層解決方案
2、ansible架構解析
用戶通過ansible去管理各個主機,那么ansible就是我們所說的主控端,后面的Host為被控端。
在控制主機時,ansible是如何知道哪些主機是被自己控制的呢?
這就需要一個Host Inventory(主機清單),用於記錄ansible可以控制網絡中的哪些主機。另外,要配置和管理這些主機,可以采用兩種方式,一種是單一的命令實現,另外一種也可以使用palybook實現。單一的命令模式是采用不同的模塊進行管理,一個模塊類似於一些管理的命令,如top,ls,ping等等,適用於臨時性的操作任務。如果需要執行一些例行性或經常性的操作,則需要采用playbook的方式,playbook類似於一個腳本,將多個模塊按一定的邏輯關系進行組合,然后執行。ansible還支持一些插件,如郵件、日志等,在和遠程主機通信時,也會采用類似的連接插件,這里使用則是SSH協議的插件進行通信。
3、ansible主要組成部分
1)命令執行來源:
- ANSIBLE PLAYBOOKS :任務劇本,編排定義ansible任務急的配置文件,有Ansible順序執行,通常為json格式的YAML文件
- INBENTORY:Ansible管理主機的清單/etc/anaible/hosts
- MODULES:Ansible的執行命令的功能模塊,多數為內置核心模塊,也可以自定義
- PLUGINS:模塊功能補充,比如鏈接類型插件、循環插件、變量插件、過濾插件等,不常用
- API:供第三方程序調用的應用程序編程接口
- ANSIBLE:組合INVENTORY API MODUES PLUGINS的綠框,可以理解為Ansible的命令工具,其為核心執行工具
2)利用ansible實現管理的方式
- Ad-Hoc即ansible命令,主要用於臨時命令場景
- ansible-playbook主要用戶長期規划好的,大型項目的場景,需要提前規划
3)Ansile-playbook執行過程
- 將已有編排好的任務急寫入Ansible-playbook
- 通過ansible-playbook命令分拆任務急至逐條ansible命令,按照預定規則執行
4)Ansible主要操作對象
- Hosts主機
- Networking網絡設備
5)注意事項
- 執行ansile的主機一般稱為主控端,中控,master或堡壘機
- 主控端python版本需要2.6以上
- 被控端python版本需要2.4以上,小於2。4需要安裝python-simplejson
- 被控端如開啟selinux需要安裝libselinux-python
- windows端不能作為主控端
4、anisble部署
- (1)環境說明
主機名稱 | IP地址 | 角色 | 系統版本 |
---|---|---|---|
ansible | 192.168.56.11 | 主控端 | Centos 7.x |
node01 | 192.168.56.12 | 被控端 | Centos 7.x |
node02 | 192.168.56.13 | 被控端 | Centos 7.x |
- (2)ansible部署
[root@ansible ~]# yum install -y ansible
[root@ansible ~]# ansible --version
ansible 2.7.10
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
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
- (3)ansible主要配置文件功能解析
/etc/ansible/ansible.cfg #主配置文件,配置ansible工作特性
/etc/ansible/hosts #主機清單
/etc/ansible/roles/ #存放角色的目錄
/usr/bin/ansible #主程序,臨時命令執行工具
/usr/bin/ansible-doc #查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy #下載/上傳優秀代碼或Roles模塊的官網平台
/usr/bin/ansible-playbook #定制自動化任務,編排劇本工具
/usr/bin/ansible-pull #遠程執行命令的工具
/usr/bin/ansible-vault #文件加密工具
/usr/bin/ansible-console #基於Console界面與用戶交互的執行工具
- (4)小試牛刀
[root@ansible ~]# ansible --help #查看ansible使用幫助
Usage: ansible <host-pattern> [options] #使用方法,ansible+主機+選項
[root@ansible ~]# ansible 192.168.56.12 -m ping #檢測主機的存活,返回pong則是正常,這里使用了-m參數,采用ping模塊進行檢測目標主機的存活性
192.168.56.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@ansible ~]# ansible -m ping 192.168.56.13 #連接另外1台被控端,提示無法匹配
[WARNING]: Could not match supplied host pattern, ignoring: 192.168.56.13
[WARNING]: No hosts matched, nothing to do
#這里就需要在主機清單中增加被控端主機,需要注意的是,主機清單也支持分組模式,這里將三台主機分為web組
[root@ansible ~]# vim /etc/ansible/hosts
[web]
192.168.56.11
192.168.56.12
192.168.56.13
[root@ansible ~]# ansible web -m ping #通過對一組服務器進行存活性檢測
192.168.56.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.56.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.56.11 | SUCCESS => {
"changed": false,
"ping": "pong"
}
#PS:這里需要注意的是,遠程連接采用的不是單純的ping命令,如果沒有做ssh密鑰認證,是會出現無法ping通的錯誤,此時可以采用-k參數,默認執行使用root用戶進行連接遠程主機。
[root@ansible ~]# ansible 192.168.56.13 -m ping -k
SSH password:
192.168.56.13 | SUCCESS => {
"changed": false,
"ping": "pong"
在使用ansible時,我們會發現ssh鏈接較慢的現象,這里則需要修改sshd服務的兩個參數來解決該問題:
UseDNS no
GSSAPIAuthentication no
5、主配置文件ansible.cfg解析
配置文件大部分都是注釋,只需要保持默認配置即可。這里需要開啟日志記錄以及關閉遠程首次連接的ssh認證檢查。
[root@ansible ~]# vim /etc/ansible/ansible.cfg
[defaults] 默認配置
# some basic default values...
#inventory = /etc/ansible/hosts #主機列表配置文件
#library = /usr/share/my_modules/ #庫文件存放目錄
#module_utils = /usr/share/my_module_utils/ #模塊存放目錄
#remote_tmp = ~/.ansible/tmp #臨時py命令文件存放在遠程主機目錄
#local_tmp = ~/.ansible/tmp #本機的臨時命令執行目錄
#forks = 5 #默認並發數
#poll_interval = 15 #時間間隔
#sudo_user = root #默認sudo用戶
#ask_sudo_pass = True #每次執行ansible命令是否詢問sudo用戶密碼
#ask_pass = True #每次執行ansible命令是否詢問ssh密碼
#transport = smart #傳輸方式
#remote_port = 22 #遠程端口號
#module_lang = C
#module_set_locale = False
... ...
host_key_checking = False #檢查對應服務器的host_key,建議取消注釋.
log_path=/var/log/ansible.log #記錄日志及位置,默認不記錄 建議取消注釋