Ansible6:Playbook簡單使用

   ansbile-playbook是一系列ansible命令的集合,利用yaml 語言編寫。playbook命令根據自上而下的順序依次執行。同時,playbook開創了很多特性,它可以允許你傳輸某個命令的狀態到後面的指令,如你可以從一臺機器的文件中抓取內容並附爲變量,然後在另一臺機器中使用,這使得你可以實現一些複雜的部署機制,這是ansible命令無法實現的。

    playbook通過ansible-playbook命令使用,它的參數和ansible命令類似,如參數-k(–ask-pass) 和 -K (–ask-sudo) 來詢問ssh密碼和sudo密碼,-u指定用戶,這些指令也可以通過規定的單元寫在playbook 。

    ansible-playbook的簡單使用方法: ansible-playbook example-play.yml 。

一、一個簡單的示例

下面是一個簡單的ansible-playbook示例,可以瞭解其構成:

# cat user.yml
- name: create user
 hosts: all
 user: root
 gather_facts: false
 vars:
   user:"test"
 tasks:
   - name: create  user
     user: name="` user `"

上面的playbook 實現的功能是新增一個用戶:

    name參數對該playbook實現的功能做一個概述,後面執行過程中,會打印 name變量的值 ;

    hosts參數指定了對哪些主機進行參作;

    user參數指定了使用什麼用戶登錄遠程主機操作;

    gather_facts參數指定了在以下任務部分執行前,是否先執行setup模塊獲取主機相關信息,這在後面的task會使用到setup獲取的信息時用到;

    vars參數,指定了變量,這裏指定一個user變量,其值爲test ,需要注意的是,變量值一定要用引號引住;

    task指定了一個任務,其下面的name參數同樣是對任務的描述,在執行過程中會打印出來。user提定了調用user模塊,name是user模塊裏的一個參數,而增加的用戶名字調用了上面user變量的值。

同樣,如果想實現把這個新增的用戶刪除,只需將該playbook文件的最後一行替換爲如下行再執行相應的playbook即可:

    user: name="{{ user }}" state=absent remove=yes

二、通過Playbook安裝apache示例

    通過ansible-playbook實現對多臺主機同時同時安裝apache。需要注意的是,多臺被管理主機的操作系統可能不相同,而導致apache包名不同,假設同時存在CentOS和Debian兩種操作系統,具體playbook內容如下:

# cat install_apache.yml
- hosts: all
 remote_user: root
 gather_facts:True
 tasks:
- name: install apache on CentOS
   yum: name=httpd state=present
   when: ansible_os_family =="CentOS"
- name: install apache on Debian
   yum: name=apache2 state=present
   when: ansible_os_family =="Debian"

上面使用了when語句,同時也開啓了gather_facts setup模塊,這裏的ansible_os_family變量和就是直接使用的setup模塊獲取的信息。如果有大量主機,就在運行的時候加上-f然後選擇一個合適的併發主機數量即可。

三、playbook的構成

    playbook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。其主要有以下四部分構成:

playbooks組成:
 Target section:   定義將要執行 playbook 的遠程主機組
 Variable section: 定義 playbook 運行時需要使用的變量
 Task section:     定義將要在遠程主機上執行的任務列表
 Handler section:  定義 task 執行完成以後需要調用的任務

而其對應的目錄層爲五個,如下:

一般所需的目錄層有:(視情況可變化)
 vars     變量層
 tasks    任務層
 handlers 觸發條件
 files    文件
 template 模板

1、Hosts和Users

playbook中的每一個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。

    hosts:用於指定要執行指定任務的主機其可以是一個或多個由冒號分隔主機組。

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

    user:於remote_user相同

    sudo:如果設置爲yes,執行該任務組的用戶在執行任務的時候,獲取root權限

    sudo_user:如果設置user爲breeze,sudo爲yes,sudo_user爲bernie時,則breeze用戶在執行任務時會獲得bernie用戶的權限

    connection:通過什麼方式連接到遠程主機,默認爲ssh

    gather_facts:除非明確說明不需要在遠程主機上執行setup模塊,否則默認自動執行。如果確實不需要setup模塊傳遞過來的變量,則可以將該選項設置爲False

示例:

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

2、任務列表和action

play的主體部分是任務列表。

    任務列表中的各任務按次序逐個在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  

3、handlers 

用於當關注的資源發生變化時採取一定的操作。
"notify"這個action可用於在每個play的最後被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之僅在所有的變化發生完成後一次性地執行指定操作。
在notify中列出的操作稱爲handler也即notify中調用handler中定義的操作。 

注意:在notify中定義內容一定要和tasks中定義的 - name 內容一樣,這樣才能達到觸發的效果,否則會不生效

- 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

4、tags

tags用於讓用戶選擇運行或略過playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼爲測試其確實沒有發生變化的時間依然會非常地長。此時如果確信其沒有變化就可以通過tags跳過這些代碼片斷。

5、示例

一個安裝httpd web服務的示例:

# cat /etc/ansible/playbook/install_web.yml
- hosts: webservers
  remote_user: root
  gather_fasks:False
  vars:
    packages: httpd
  tasks:    - name:Install httpd      yum: name={{ packages }} state=present- name:Cofiguration httpd      copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf      tags: httpd_conf   
      notify:        - restart httpd- name:Start httpd      service: name=httpd state=started enabled=no      tags: start- name:Add centos user      user: name={{ item }} state=absent      tags: adduser      with_items:        - centos        - admin      handlers:        - name: restart httpd          service: name=httpd state=restart


本文出自 “無名小卒” 博客,請務必保留此出處http://breezey.blog.51cto.com/2400275/1757624

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章