一、基礎介紹
1、簡介
ansible是新出現的自動化運維工具,基于Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運作指令等功能。ansible是基于子產品工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運作的子產品,ansible隻是提供一種架構。主要包括:
(1)、連接配接插件connection plugins:負責和被監控端實作通信;
(2)、host inventory:指定操作的主機,是一個配置檔案裡面定義監控的主機;
(3)、各種子產品核心子產品、command子產品、自定義子產品;
(4)、借助于插件完成記錄日志郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運作多個任務。
2、總體架構

3、工作機制
Ansible 在管理節點将 Ansible 子產品通過 SSH 協定(或者 Kerberos、LDAP)推送到被管理端執行,執行完之後自動删除,可以使用 SVN 等來管理自定義子產品及編排
以上是ansible工作原理圖,該圖是在架構圖的基本上進行的拓展。從上面的圖上可以了解到:
1、管理端支援local 、ssh、zeromq 三種方式連接配接被管理端,預設使用基于ssh的連接配接---這部分對應基本架構圖中的連接配接子產品;
2、可以按應用類型等方式進行Host Inventory(主機群)分類,管理節點通過各類子產品實作相應的操作---單個子產品,單條指令的批量執行,我們可以稱之為ad-hoc;
3、管理節點可以通過playbooks 實作多個task的集合實作一類功能,如web服務的安裝部署、資料庫伺服器的批量備份等。playbooks我們可以簡單的了解為,系統通過組合多條ad-hoc操作的配置檔案。
4、特性
(1)、no agents:不需要在被管控主機上安裝任何用戶端;
(2)、no server:無伺服器端,使用時直接運作指令即可;
(3)、modules in any languages:基于子產品工作,可使用任意語言開發子產品;
(4)、yaml,not code:使用yaml語言定制劇本playbook;
(5)、ssh by default:基于SSH工作;
(6)、strong multi-tier solution:可實作多級指揮。
5、優點
(1)、輕量級,無需在用戶端安裝agent,更新時,隻需在操作機上進行一次更新即可;
(2)、批量任務執行可以寫成腳本,而且不用分發到遠端就可以執行;
(3)、使用python編寫,維護更簡單,ruby文法過于複雜;
(4)、支援sudo。
二、Ansible基礎安裝與配置
1、Ansible基礎安裝
方式一 源碼安裝
apt-get install ieee-data sshpass python-setuptoolspython-crypto python-yaml python-ecdsa python-httplib2 python-jinja2python-markupsafe python-netaddr python-paramiko python-selinux
wget http://releases.ansible.com/ansible/ansible-2.1.2.0.tar.gz
tar -zxf ansible-2.1.2.0.tar.gz
cd ansible-2.1.2.0
python setup.py install
方式二 apt-get或者pip安裝
apt-get installansible
pip install ansible
2、Ansible配置
(1)、SSH免密鑰登入設定
ssh-key-gen -t rsa
ssh-copy-idremote_ip
(2)、ansible配置
vim/etc/ansible/hosts
jumperansible_ssh_host=192.168.122.11
[test]
192.168.122.1[1:5]
(3)、簡單測試
ansible test -m ping
ansible test -m command -a ‘uptime’
3、常用子產品使用
(1)、setup
## 用來檢視遠端主機的一些基本資訊
ansible test -m setup
(2)、ping
## 用來測試遠端主機的運作狀态
(3)、file
## 設定檔案的屬性
ansible test -m file -a "dest=/tmp/aa.txt mode=600owner=mdehaan group=mdehaan"
ansible test -m file -a "dest=/path/to/c mode=755owner=lisuochen group=root state=directory"
(4)、copy
## 複制檔案到遠端主機
ansible test -m copy -a 'src=/etc/hosts dest=/tmp/hostsowner=lisuochen group=lisuochen mode=0644'
(5)、command
## 在遠端主機上執行指令
ansible test -m command -a "uptime
(6)、shell
## 切換到某個shell執行指定的指令,參數與command相同。
與command不同的是,此子產品可以支援指令管道
ansible -m shell-a ‘cat /etc/hosts | grep localhost’
(7)、更多子產品
其他常用子產品,比如:service、cron、yum、synchronize就不一一例舉,可以結合自身的系統環境進行測試。
service:系統服務管理
cron:計劃任務管理
yum:yum軟體包安裝管理
synchronize:使用rsync同步檔案
user:系統使用者管理
group:系統使用者組管理
更多子產品可以參考:
#ansible-doc –l
(8)、一些概念補充
playbook的組成:playbook是由一個或多個“play”組成的清單,可以讓它們聯同起來按事先編排的機制執行;所謂task無非是調用ansible的一個module,而在子產品參數中可以使用變量;子產品執行是幂等的,這意味着多次執行是安全的,因為其結果均一緻;
執行模型:task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後再開始第二個。在順序運作某playbook時,如果中途發生錯誤,所有已執行任務都将復原,是以,在修改playbook後重新執行一次即可;
task組成:每個task都應該有其name,用于playbook的執行結果輸出,建議其内容盡可能清晰地描述任務執行步驟。如果未提供name,則action的結果将用于輸出;
notify指定handler的執行機制:“notify”這個action可用于在每個play的最後被觸發,在notify中列出的操作稱為handler,僅在所有的變化發生完成後一次性地執行指定操作。
三、後續工作
1、深入學習ansible的playbook以及擴充子產品;
2、通過ansible部署公司的自動化運維平台;
3、嘗試自動化運維工具saltstack,并将其與ansible進行對比。