一、簡介
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來和遠端主機通訊的。
二、安裝及初步使用
2.1、編譯安裝,本處使用yum安裝
1
<code>[root@localhost ~]# yum install -y ansible</code>
說明:如果想要yum安裝的話,請配置epel源
2.2、準備配置檔案
修改/etc/ansible/hosts檔案
2
3
4
5
<code>[webservers]</code>
<code>172.16</code><code>.</code><code>130.2</code>
<code>172.16</code><code>.</code><code>130.3</code>
<code>可以用主機名也可以用ip位址</code>
<code>可以定于多個</code>
2.2、簡單應用
ansible通過ssh實作配置管理、應用部署、任務執行等功能,是以,需要事先配置ansible端能基于密鑰認證的方式聯系各被管理節點。
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
例如:要檢視兩台機器的時間
<code>[root@localhost ansible]# ansible all -a </code><code>"date"</code>
<code>192.168</code><code>.</code><code>1.201</code> <code>| success | rc=</code><code>0</code> <code>>></code>
<code>Fri Mar </code><code>28</code> <code>16</code><code>:</code><code>02</code><code>:</code><code>25</code> <code>CST </code><code>2014</code>
<code>192.168</code><code>.</code><code>1.200</code> <code>| success | rc=</code><code>0</code> <code>>></code>
<code>Sat Apr </code><code>19</code> <code>20</code><code>:</code><code>55</code><code>:</code><code>25</code> <code>CST </code><code>2014</code>
-m module:預設為command
ansible-doc 檢視ansible的子產品
-l 列出所有的ansible子產品
-s 列出該子產品的相關指令
2.3、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的官方網站http://www.yaml.org。
2.4、YAML文法
YAML的文法和其他高階語言類似,并且可以簡單表達清單、散清單、标量等資料結構。其結構(Structure)通過空格來展示,序列(Sequence)裡的項用"-"來代表,Map裡的鍵值對用":"分隔。下面是一個示例。
6
7
8
9
10
11
12
13
14
15
<code>name: John Smith</code>
<code>age: </code><code>41</code>
<code>gender: Male</code>
<code>spouse:</code>
<code> </code><code>name: Jane Smith</code>
<code> </code><code>age: </code><code>37</code>
<code> </code><code>gender: Female</code>
<code>children:</code>
<code> </code><code>- name: Jimmy Smith</code>
<code> </code><code>age: </code><code>17</code>
<code> </code><code>gender: Male</code>
<code> </code><code>- name: Jenny Smith</code>
<code> </code><code>age </code><code>13</code>
<code> </code><code>gender: Female</code>
<code>YAML檔案擴充名通常為.yaml,如example.yaml。</code>
2.5 ansible playbooks
playbook是由一個或多個“play”組成的清單。play的主要功能在于将事先歸并為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。将多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一台大戲
<code>hosts: webnodes</code>
<code> </code><code>var</code><code>s:</code>
<code> </code><code>http_port: </code><code>80</code>
<code> </code><code>max_clients: </code><code>256</code>
<code> </code><code>remote_user: root</code>
<code> </code><code>tasks:</code>
<code> </code><code>- name: ensure apache </code><code>is</code> <code>at the latest version</code>
<code> </code><code>yum: name=httpd state=latest</code>
<code> </code><code>- name: ensure apache </code><code>is</code> <code>running</code>
<code> </code><code>service: name=httpd state=started</code>
<code> </code><code>handlers:</code>
<code> </code><code>- name: restart apache</code>
<code> </code><code>service: name=httpd state=restarted</code>
2.6 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”格式,例如:
- name: disable selinux
command: /sbin/setenforce 0
如果指令或腳本的退出碼不為零,可以使用如下方式替代:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤資訊:
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
本文轉自wangfeng7399 51CTO部落格,原文連結:http://blog.51cto.com/wangfeng7399/1399889,如需轉載請自行聯系原作者