ansible playbook

說明:這篇文章依賴上一篇的環境html

http://ximenfeibing.blog.51cto.com/8809812/1669162node

Yml介紹

Playbook是使用yaml語言定製的,YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其餘多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy dt Net與Oren Ben-Kiki也是這語言的共同設計者。mysql

Yml語法:

- host: websrvs                #定義執行的主機
  remote_user: root            #定義執行的用戶
  tasks:                       #定義任務
    - task1                    #定義第一個任務名稱
    module_name: module_args   #定義使用的模塊,和模塊參數
   -  task 2                   #定義第二個任務名稱

簡單示例1:

定義一個yml:對webserver組中的主機,調用group和user模塊建立組和用戶;對dbserver組中的主機調用copy模塊複製文件。linux

執行ymlnginx

執行第二遍,返回的全部結果爲ok不是表示執行ok而是全部條件都知足web

簡單示例2:

搭建一個apache環境sql

準備須要複製到被管理主機的httpd.conf配置文件,修改監聽端口爲8080
shell

[root@node1 ~]# mkdir conf
[root@node1 ~]# cp /etc/httpd/conf /httpd.conf conf/
[root@node1 ~]# vim conf/httpd.conf
Listen 8080

應用以前先中止webserver組中的httpd服務,並卸載數據庫

[root@node1 ~]# ansible webserver -a 'service httpd stop'
[root@node1 ~]# ansible websrvs -m yum -a 'name=httpd state=absent'

執行:apache

驗證:httpd軟件包已經安裝,服務開機自動啓動,並且也監聽8080端口

[root@node2 ~]# rpm -qa httpd
httpd-2.2.15-39.el6.centos.x86_64
[root@node2 ~]# chkconfig --list httpd
httpd          0:off1:off2:on3:on4:on5:on6:off
[root@node2 ~]# netstat -lntp | grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      40826/httpd

YAML中的變量

一、自定義變量

二、facts

收集被管理主機的信息時,會返回不少變量,這裏就是調用了返回的ipv4地址變量

示例:將客戶端返回的ip地址,建立webserver組中主機的/tmp/test.ans文件。

執行結果以下:

驗證:使用的變量名同樣,可是生成的內容倒是被管理主機的ip地址

[root@node2 ~]# cat /tmp/test.ans
[u'172.16.4.101']
[root@node3 ~]# cat /tmp/test.ans
[u'172.16.4.102']

三、主機變量

示例:對webserver組中的主機,定義testvar變量,值爲ip地址後兩位

[root@node1 ~]# vim /etc/ansible/hosts
[webserver]
172.16.4.101 testvar="4.101"
172.16.4.102 testvar="4.102"
[dbserver]
172.16.4.103

設置yml文件,和使用其餘變量同樣的方法調用變量:

執行yml

驗證:相同變量,不一樣主機獲得了不一樣的值

[root@node2 ~]# cat /tmp/test.ans
[u'172.16.4.101'],4.101
[root@node3 ~]# cat /tmp/test.ans
[u'172.16.4.102'],4.102

四、配置文件中引用變量(模版)

示例:使用變量指定httpd.conf配置文件中一些參數的值

定義配置文件中使用的變量

[root@node1 ~]# vim temolastes/httpd.conf.j2
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       {{ maxClients }}
MaxRequestsPerChild  4000
</IfModule>
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}

修改Ansible的hosts文件定義主機變量

[root@node1 ~]# vim /etc/ansible/hosts
[webserver]
172.16.4.101 http_port=80 maxClients=100
172.16.4.102 http_port=8080 maxClients=200
[dbserver]
172.16.4.103

定義yml:定義的過程當中使用變量,根據不一樣主機定義的值不一樣,生成的配置文件參數也不一樣

執行過程

驗證:相同的playbook因爲對hosts指定的變量不一樣,因此生成不一樣的配置文件

node2:
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       100
MaxRequestsPerChild  4000
</IfModule>
Listen 80
ServerName node2
node3:
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       200
MaxRequestsPerChild  4000
</IfModule>
Listen 8080
ServerName node3

條件測試

When語句

示例:添加用戶,可是隻對主機名爲node2的主機添加。

執行結果以下:

迭代

當有須要重複性執行的任務時,可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句來指明迭代的元素列表便可。例如:

上面語句的功能等同於下面的語句:

- name: create user
user: name=testuser1
- name: create user
user: name=testuser2


事實上,with_items中可使用元素還可爲hashes,例如:

ansible的循環機制還有更多的高級功能,具體請參見官方文檔(http://docs.ansible.com/playbooks_loops.html)。

Playbook

playbook是由一個或多個「play」組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色。從根本上來說,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,便可以讓它們聯同起來按事先編排的機制同唱一臺大戲。

playbook基礎組件

HostsUsers

playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用於指定要執行指定任務的主機,其能夠是一個或多個由冒號分隔主機組;remote_user則用於指定遠程主機上的執行任務的用戶。如上面示例中的

    -hosts: webnodes
   remote_user:root

 

不過,remote_user也可用於各task中。也能夠經過指定其經過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶。

- hosts: webnodes
    remote_user: mageedu
    tasks:
    - name: test connection
      ping:
      remote_user: mageedu
      sudo: yes

任務列表和action

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

Inventory

ansible的主要功用在於批量主機操做,爲了便捷地使用其中的部分主機,能夠在inventory file中將其分組命名。默認的inventory file爲/etc/ansible/hosts。

inventory文件格式:

inventory文件遵循INI文件風格,中括號中的字符爲組名。能夠將同一個主機同時歸併到多個不一樣的組中;此外,當如若目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口號來標明。

    ntp.xmfb.com
 
    [webservers]
    www1.xmfb.com:2222
    www2.xmfb.com
 
    [dbservers]
    db1.xmfb.com
    db2.xmfb.com
    db3.xmfb.com

若是主機名稱遵循類似的命名模式,還可使用列表的方式標識各主機,例如:

[webservers]
www[01:50].example.com
 
[databases]
db-[a:f].example.com

組嵌套

inventory中,組還能夠包含其它的組,而且也能夠向組中的主機指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持。例如:

[apache]
httpd1.xmfb.com
httpd2.xmfb.com
 
[nginx]
ngx1.xmfb.com
ngx2.xmfb.com
 
[webservers:children]
apache
nginx
 
[webservers:vars]
ntp_server=ntp.xmfb.com

Handlers

示例:定義配置文件發生修改以後,在執行yml文件,會重啓httpd服務。

定義的內容:

wKiom1WRX_GhJD5-AAGpBnWpKqY328.jpg

修改配置文件的監聽端口爲80

[root@node1 ~]# vim conf/httpd.conf
Listen 80

執行結果

wKioL1WRYbPSqPgDAANa0KsyG3g315.jpg

驗證:webserver組中的主機httpd端口更改與否

[root@node2 ~]# netstat -lntp | grep httpd
tcp       0      0 :::80                       :::*                        LISTEN      41848/httpd

tags

tags用於讓用戶選擇運行或路過playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時,若是確信其沒有變化,就能夠經過tags跳過此些代碼片段。

 

示例:將修改配置文件部分定義爲tags,一旦配置文件發生改變,能夠跳過安裝和啓動服務,只執行復制配置文件和handlers

wKiom1WRYGOwAeqIAAGoLjcmjMo505.jpg

驗證:使用tags執行conf,只是出現了conf這個任務的執行

wKioL1WRYiyheAaNAAIEKYg-Zzo664.jpg

Roles

ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模塊及處理器放置於單獨的目錄中,並能夠便捷地include它們的一種機制。角色通常用於基於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。

建立role的步驟

 (1)建立以roles命名的目錄;

 (2)在roles目錄中分別建立以各角色名稱命名的目錄,如webservers等;

 (3)在每一個角色命名的目錄中分別建立files、handlers、meta、tasks、templates和vars目錄;用不到的目錄能夠建立爲空目錄,也能夠不建立;

 (4)在playbook文件中,調用各角色;

role內各目錄中可用的文件

tasks目錄:至少應該包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件可使用include包含其它的位於此目錄中的task文件;

files目錄:存放由copy或script等模塊調用的文件;

templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;

handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位於此目錄中;

vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;

meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係;ansible 1.3及其之後的版本才支持;

default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;

示例:定義一個簡單的roles

建立相關目錄

[root@node1 ~]# mkdir -pvansible_playbooks/roles/{webserver,dbserver}/{tasks,files,templates,meta,handlers,vars}
[root@node1 ~]# tree ansible_playbooks/
ansible_playbooks/
└── roles
    ├── dbserver
    │  ├── files
    │  ├── handlers
    │  ├── meta
    │  ├── tasks
    │  ├── templates
    │  └── vars
    └── webserver
        ├── files
        ├── handlers
        ├── meta
        ├── tasks
        ├── templates
        └── vars
 
15 directories, 0 files

Webserver建立配置文件

[root@node1 ~]# cp /etc/httpd/conf/httpd.confansible_playbooks/roles/webserver/files/

在tasks目錄下,定義yml,此處只須要定義執行的任務

wKiom1WRYRGRFP_dAAECRk_VgHA670.jpg

在handlers目錄下,定義handlers

wKioL1WRYtPxvAkRAACCShULbqE755.jpg

在目錄名同級目錄,定義roles,只須要指明運行的主機和用戶身份已經調用的角色便可

wKiom1WRYRKwaKTDAAByfKKkK8M729.jpg

執行結果

wKioL1WRYtSjXPzfAAM9cGD7c0U046.jpg

定義多個roles,實現重用效果

示例:在4.101配置web服務,在4.102配置數據庫,在4.103及配置web又配置數據庫;

 

複製mysql配置文件

[root@node1 ~]# cp /etc/my.cnfansible_playbooks/roles/dbserver/files/

定義tasks

wKiom1WRYZjTXcMuAAEqaW3dDLw195.jpg

定義handlers

wKioL1WRY1rwmnqtAACDd0J81Fw508.jpg

定義site.yml,在4.101配置web服務,在4.102配置數據庫,在4.103及配置web又配置數據庫。

wKiom1WRYZmTAUZuAADd4OeykHs993.jpg

執行結果:

wKiom1WRYZqixTkfAAalfEvqM-c355.jpg

相關文章
相關標籤/搜索