運維自動化工具Ansible的簡單介紹

luashin發表於2016-04-01
一、簡介
   ansible是個什麼東西呢?官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。這個工具的目標有這麼幾項:讓我們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。
   所有的這幾個目標本質上來說都是在一個臺或者幾臺伺服器上,執行一系列的命令而已。就像我之前有介紹過的Fabric,以及我們基於Fabric開發的自動化應用部署的工具: Essay 。都是做了這麼個事——批次的在遠端伺服器上執行命令 。
   那麼fabric和ansible有什麼差別呢?簡單來說fabric像是一個工具箱,提供了很多好用的工具,用來在Remote執行命令,而Ansible則是提供了一套簡單的流程,你要按照它的流程來做,就能輕鬆完成任務。這就像是庫和框架的關係一樣。
   當然,它們之間也是有共同點的——都是基於 paramiko 開發的。這個paramiko是什麼呢?它是一個純Python實現的ssh協議庫。因此fabric和ansible還有一個共同點就是不需要在遠端主機上安裝client/agents,因為它們是基於ssh來和遠端主機通訊的。
Ansible 快速上手  

二、安裝及初步使用
2.1、編譯安裝,本處使用yum安裝   
[root@localhost ~]# yum install -y ansible
說明:如果想要yum安裝的話,請配置epel源

2.2、準備配置檔案
修改/etc/ansible/hosts檔案
[webservers]
172.16.130.2
172.16.130.3
可以用主機名也可以用ip地址
可以定於多個

2.3、簡單應用
    ansible透過ssh實現配置管理、應用部署、任務執行等功能,因此,需要事先配置ansible端能基於金鑰認證的方式聯絡各被管理節點。
    ansible [-f forks] [-m module_name] [-a args]
    例如:要檢視兩臺機器的時間
[root@localhost ansible]# ansible all -a "date"
192.168.1.201 | success | rc=0 >>
Fri Mar 28 16:02:25 CST 2014
192.168.1.200 | success | rc=0 >>
Sat Apr 19 20:55:25 CST 2014
  -m module:預設為command
  -l 列出所有的ansible模組
  -s 列出該模組的相關指令
ansible-doc 檢視ansible的模組


2.4、YAM
   YAML是一個可讀性高用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy  Net與Oren Ben-Kiki也是這語言的共同設計者。
    YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。其特性:
    YAML的可讀性好
    YAML和指令碼語言的互動性好
    YAML使用實現語言的資料型別
    YAML有一個一致的資訊模型
    YAML易於實現
    YAML可以基於流來處理
    YAML表達能力強,擴充套件性好
    YAML的官方網站。

 2.5、YAML語法
   YAML的語法和其他高階語言類似,並且可以簡單表達清單、雜湊表、標量等資料結構。其結構(Structure)透過空格來展示,序列(Sequence)裡的項用"-"來代表,Map裡的鍵值對用":"分隔。下面是一個示例。
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age 13
gender: Female
YAML副檔名通常為.yaml,如example.yaml。

2.6、ansible playbooks
   playbook是由一個或多個“play”組成的列表。play的主要功能在於將事先歸併為一組的主機裝扮成事先透過ansible中的task定義好的角色。從根本上來講,所謂task無非是呼叫ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲
hosts: webnodes
vars:
http_port: 80
max_clients: 256
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted

2.7、playbook基礎組建
①、HOSTS和Users
   playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的使用者身份執行任務。hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組;remote_user則用於指定遠端主機上的執行任務的使用者。如上面示例中的
-hosts: webnodes
remote_user: root
不過,remote_user也可用於各task中。也可以透過指定其透過sudo的方式在遠端主機上執行任務,其可用於play全域性或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的使用者。
- hosts: webnodes
remote_user: wangfeng7399
tasks:
- name: test connection
ping:
remote_user: wangfeng7399
sudo: yes

②、任務列表和cation
   play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後再開始第二個。在執行自下而下某playbook時,如果中途發生錯誤,所有已執行任務都將回滾,因此,在更正playbook後重新執行一次即可。
   task的目的是使用指定的引數執行模組,而在模組引數中可以使用變數。模組執行是冪等的,這意味著多次執行是安全的,因為其結果均一致。
   每個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用於輸出。
   定義task的可以使用“action: module options”或“module: options”的格式,推薦使用後者以實現向後相容。如果action一行的內容過多,也中使用在行首使用幾個空白字元進行換行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
在眾多模組中,只有command和shell模組僅需要給定一個列表而無需使用“key=value”格式,例如:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
如果命令或指令碼的退出碼不為零,可以使用如下方式替代:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤資訊:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True

③、handlers
用於當關注的資源發生變化時採取一定的操作。
“notify”這個action可用於在每個play的最後被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之,僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中呼叫handler中定義的操作。
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handler是task列表,這些task與前述的task並沒有本質上的不同。
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9034054/viewspace-2073874/,如需轉載,請註明出處,否則將追究法律責任。

相關文章