Ansible 自動化運維工具簡單入門(一)


參考該視頻制作:http://edu.51cto.com/center/course/user/get-study-course

一、簡介

Ansible 簡單的說是一個配置管理系統(configuration management system)。你只需要可以使用 ssh 訪問你的服務器或設備就行。它也不同於其他工具,因為它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你可以將代碼部署到任意數量的服務器上

1、特性

模塊化:

  • 調用特定的模塊,完成特定的任務
  • 有paramiko、PyYAML、jinja2三個關鍵模塊
  • 支持自定義模塊
  • 基於python語言開發
  • 部署簡單就要python和ssh,agentless
  • 安全,基於Openssh
  • 支持playbook編排任務
  • 冪等性:一個任務執行一遍和執行n遍效果一樣,不會因為重復執行帶來意外情況
  • 無序代理不依賴PKI(無需ssl)
  • 可使用認可編程語言編寫模塊
  • YAML格式編排任務,支持豐富的數據結構
  • 叫強大的多層解決方案

2、ansible架構

3、工作原理

4、主要組成部分

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端不能作為主控端

二、部署及配置Ansible

部署環境介紹:

主機名 IP 角色 系統
ansible 172.16.111.6 主控端 CentOS 7.5
node1 172.16.111.7 被控端 CentOS 7.5
node2 172.16.111.8 被控端 CentOS 7.5
node3 172.16.111.9 被控端 CentOS 7.5

安裝方式很多,本次只演示一種安裝yum安裝

1、在Ansible主機部署ansble

[root@ansible ~]# yum install ansible -y
[root@ansible ~]# rpm -qa ansible
ansible-2.4.2.0-2.el7.noarch
[root@ansible ~]# ansible --version
ansible 2.4.2.0
  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 = /bin/ansible
  python version = 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

2、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界面與用戶交互的執行工具

3、編輯hosts連接被控端 hosts

​ 配置被控端的主機清單

[root@ansible ~]# vim /etc/ansible/hosts 

插入下面三行,保存退出

172.16.111.7
172.16.111.8
172.16.111.9

執行命令嘗試連接被控端

[root@ansible ~]# ansible 172.16.111.7 -m ping
The authenticity of host '172.16.111.7 (172.16.111.7)' can't be established.
ECDSA key fingerprint is SHA256:e+1rZSlP7YYndeivr7Hjikf3D+Yg9it2KBNxmpjpkQ8.
ECDSA key fingerprint is MD5:a8:ab:5e:ac:55:e5:d6:fe:bb:1a:9d:41:19:d5:de:7a.
Are you sure you want to continue connecting (yes/no)?yes
172.16.111.7 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.16.111.7' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}

發現此時是使用SSH命令來連接而不是簡單的ping,此時無法接通。需要認證用戶密碼或者key

[root@ansible ~]# ansible 172.16.111.7 -m ping -k
SSH password: 
172.16.111.7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"

-k 用戶名 通過用戶名密碼來連接被控端 默認是root

-m 功能

解決ssh連接慢的問題 修改/etc/ssh/sshd_config文件內的UseDNS no 和 GSSAPIAuthentication no

測試連接多個被控端

[root@ansible ~]# ansible 172.16.111.7,172.16.111.8,172.16.111.9 -m ping -k  或者
[root@ansible ~]# ansible all -m ping -k
SSH password: 
172.16.111.9 | FAILED! => {
    "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
}
172.16.111.8 | FAILED! => {
    "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
}
172.16.111.7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

此時出現問題 我們寫入的順序是7 8 9 (all代表host內所有主機) 但是讀取的順序是 9 8 7 而且只出現一次輸入root密碼(只),別的都沒提示,所以-k連接只適合連接單個被控端。

查看可知,該命令只會記住一個host的口令,需要手動ssh連接一次才可以。所以推薦基於key驗證實現(后面有介紹)

[root@ansible ~]# cat .ssh/known_hosts 
172.16.111.7 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPkK1F+Hc+cQLSP7usLqHbu/hHAUvGc2lUvtHiwKXHLDZZDDR2a5oeVz2xIjkdpl9NTN/dQS0FwqGq8/1BHo23c=

也可以對hosts進行分組

[root@ansible ~]# vim /etc/ansible/hosts 
## db-[99:101]-node.example.com   #支持此種語法
[web]
172.16.111.7
172.16.111.8

[db]
172.16.111.9
172.16.111.7
[app]
172.16.111.[7:9]

執行驗證(已經通過SSH認證過所有被控端)

[root@ansible ~]# ansible app  -m ping -k
SSH password: 
172.16.111.7 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
172.16.111.9 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
172.16.111.8 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

連接完成

4、查看主配置文件ansible.cfg

[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  #命令相關
#local_tmp      = ~/.ansible/tmp  #命令相關
#forks          = 5   #並行連接數  
#poll_interval  = 15  #時間間隔
#sudo_user      = root  #執行命令的方式可切換到root
#ask_sudo_pass = True   #口令
#ask_pass      = True   #口令
#transport      = smart  #傳輸方式
#remote_port    = 22    #遠程端口號
#module_lang    = C
#module_set_locale = False
... ...
#host_key_checking = False  #檢查對應服務器的host_key,建議取消注釋.
#log_path=/var/log/ansible.log #記錄日志及位置,默認不記錄 建議取消注釋

修改后保存退出,運行驗證

[root@ansible ~]# rm -f .ssh/known_hosts  #刪除之前ssh連接記錄的key,進行實驗
[root@ansible ~]# ansible 172.16.111.9  -m ping -k
SSH password: 
172.16.111.9 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
[root@ansible ~]# ls /var/log/ansible.log 
/var/log/ansible.log
[root@ansible ~]# less /var/log/ansible.log 

2018-10-24 14:04:31,311 p=126499 u=root |  172.16.111.9 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
/var/log/ansible.log 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM