自動化部署工具——Ansible二次探索

playbook簡介php

    playbook是ansible用於配置、部署和管理被控節點的劇本,經過playbook的詳細描述,執行其中的一系列tasks,可讓遠程主機達到預期的狀態,playbook就像Ansible控制器給被控節點列出的一系列to-do-list,而被控節點必需要完成。css

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

其主要有如下四部分構成:html

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

playbook使用場景
java

    執行一些簡單的任務,使用ad-hoc命令能夠方便的解決問題,可是有時一個設施太過於複製,須要大量的操做時,執行ad-hoc命令就不太合適,這時最好使用playbook,就像執行shell命令與寫shell腳本同樣,也能夠理解爲批處理任務,不過playbook有本身的語法格式,具體能夠看下面介紹。node

    使用playbook你能夠方便的重用這些代碼,能夠移值到不一樣的機器上面,像函數同樣,最大化的利用代碼。在使用ansible的過程當中,所處理的大部分操做都是須要編寫playbook的。python

YAML語法
mysql

    playbook由YMAL語言編寫,YMAL參考了其餘多種語言,包括:XML、C語言、python、perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發表了這種語言,另外Ingy dot Net與Oren Ben-Kiki也是這種語言的共同設計者。linux

    YAML介紹:YAML 語言(發音 /jml/ )的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串行化格式。YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思實際上是:「Yet Another Markup Language"(還是一種標記語言)。其特性:nginx

YAML的可讀性好    
YAML和腳本語言的交互性好  
YAML使用實現語言的數據類型  
YAML有一個一致的信息模型  
YAML易於實現  
YAML能夠基於流來處理  
YAML表達能力強擴展性好

經常使用數據結構web

它的基本語法規則以下。

大小寫敏感
使用縮進表示層級關係
縮進時不容許使用Tab鍵,只容許使用空格。
縮進的空格數目不重要,只要相同層級的元素左側對齊便可
yaml文件第一行必需要「---」做爲文檔的開始

# 表示註釋,從這個字符一直到行尾,都會被解析器忽略。

YAML 支持的數據結構有三種。

對象:鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數組:一組按次序排列的值,又稱爲序列(sequence) / 列表(list)
純量(scalars):單個的、不可再分的值


YAML語法

 
YAML的語法和其餘高階語言相似而且能夠簡單表達清單、散列表、標量等數據結構。其結構Structure經過空格來展現序列Sequence裏的項用 "-" 來表明
Map裏的鍵值對用 ":" 分隔。YAML文件擴展名一般爲.yaml或者.yml。下面是一個示例。
 
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 2 個重要的結構組成部分list和directory

列表和字典

################################# list
 
列表的全部元素均使用「-」打頭例如
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
 
##############################dictionary
 
字典經過key與valuef進行標識例如
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
 
也能夠將key:value放置於{}中進行表示例如
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
 
多個映射關係組成一個字典一個列表能夠包含多個字典。


ymal中的變量

################################## 變量命名
變量名僅能由字母、數字和下劃線組成且只能以字母開頭。
 
################################## facts
facts是由正在通訊的遠程目標主機發回的信息這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的全部facts可以使用以下命令進行
# ansible hostname -m setup 這個命令能夠得到被監控端主機的各類信息將這些信息獲得後保存到變量中。
 
################################ 自定義變量
在 yaml 中可使用vars關鍵字來定義變量
vars:
  var_name: value
 
############################# 變量的引用
{{ var_name }}
 
 
########################### 特殊的變量迭代
當有須要重複性執行的任務時可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用並經過with_items語句來指明迭代的元素列表便可。
 
#######################################示例
例如在被控端添加 2 個用戶
 
方式1通常作法
- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2
  user: name=testuser2 state=present groups=wheel
 
方式2使用變量方式
- name: add several users
  vars:
   user1: testuser1
   user2: testuser2
  user: name={{ user1 }} state=present groups=wheel
  user: name={{ user2 }} state=present groups=wheel
  
方式3使用迭代方式
- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:     
    - testuser1     
    - testuser2
事實上with_items中可使用元素還可爲hashes例如
- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

Ansible-playbook


對於需反覆執行的、較爲複雜的任務,咱們能夠經過定義 Playbook 來搞定。Playbook 是 Ansible 真正強大的地方,它容許使用變量、條件、循環、以及模板,也能經過角色 及包含指令來重用既有內容。

playbook基礎組件

hosts:playbook中的每個play的目的都是爲了讓某個或某些以某個指定用戶的身份執行任務。
       hosts用於指定要執行指定任務的主機,其能夠是一個或多個由冒號分隔主機組。
 
user:remote_user則用於指定遠程主機上的執行任務的用戶。
 
任務列表:play的主體部分是task list. task list中的各任務按次序逐個在hosts中指定的全部主機
          上執行,即在全部主機上完成第一個任務後再開始第二個。
 
action:任務執行過程
 
handlers:用於當前關注的資源發生變化時採起必定指定的操做

Usage: ansible-playbook playbook.yml

相對於ansible,增長了下列選項:

參數 說明
--flush-cache 清除fact緩存
--force-handlers 若是任務失敗,也要運行handlers
--list-tags 列出全部可用的標籤
--list-tasks 列出將要執行的全部任務
--skip-tags=SKIP_TAGS 跳過運行標記此標籤的任務
--start-at-task=START_AT_TASK 在此任務處開始運行
--step 一步一步:在運行以前確認每一個任務
-t TAGS, --tags=TAGS 只運行標記此標籤的任務

示例:

ansible-playbook -i hosts ssh-addkey.yml    # 指定主機清單文件
ansible-playbook -i hosts ssh-addkey.yml  --list-tags   # 列出tags
ansible-playbook -i hosts ssh-addkey.yml  -T install  # 執行install標籤的任務


playbook語法介紹

核心元素:
hosts:運行指定任務的目標主機;
remote_user:在遠程主機以哪一個用戶身份執行;
tasks:任務,由模塊定義的操做的列表;
Templates:模板,即便用了模板語法的文本文件;
Variables:變量
handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎組件:
        hosts: 運行指定任務的目標主機    
        remote_user:在遠程主機以哪一個用戶身份執行;
            sudo_user:非管理員須要擁有sudo權限;
    tasks:任務列表
    模塊,模塊參數,格式有以下兩種:
    (1) action: module arguments
    (2) module: arguments                        
    示例1:
    - hosts: all
    remote_user: root
    tasks:
    - name: install a group
      group: name=mygrp system=true 
    - name: install a user
      user: name=user1 group=mygrp system=true
    示例2:
    - hosts: websrvs
    remote_user: root
    tasks:
    - name: install httpd package
      yum: name=httpd
    - name: start httpd service 
      service: name=httpd state=started


主要由三個部分組成。

  • hosts部分:使用hosts指示使用哪一個主機或主機組來運行下面的tasks,每一個playbook都必須指定hosts,hosts也可使用通配符格式。主機或主機組在inventory清單中指定,可使用系統默認的/etc/ansible/hosts,也能夠本身編輯,在運行的時候加上-i選項,指定清單的位置便可。在運行清單文件的時候,--list-hosts選項會顯示那些主機將會參與執行task的過程當中。

  • remote_user:指定遠端主機中的哪一個用戶來登陸遠端系統,在遠端系統執行task的用戶,能夠任意指定,也可使用sudo,可是用戶必需要有執行相應task的權限。

  • tasks:指定遠端主機將要執行的一系列動做。tasks的核心爲ansible的模塊,前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,不過仍是建議加上去,模塊是必須的,同時也要給予模塊相應的參數。


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

而其對應的目錄層有五個
通常所需的目錄層有:(視狀況可變化)

 vars     變量層
  tasks    任務層
  handlers 觸發條件
  files    文件
  template 模板


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

任務列表和action

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

    任務列表中的各任務按次序逐個在hosts中指定的全部主機上執行即在全部主機上完成第一個任務後再開始第二個。在自上而下運行某playbook時若是中途發生錯誤,全部已執行任務都將回滾所以在更正playbook後從新執行一次便可。 

    task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致。每一個task都應該有其name用於            playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name則action的結果將用於輸出。 

定義task的可使用"action: module options"或"module: options"的格式,推薦使用後者以實現向後兼容。若是action一行的內容過多也可以使用在行首使用幾個空白字符進行換行。

handlers 

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

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

tags

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



Playbook執行結果解析

使用ansible-playbook運行playbook文件,獲得以下輸出信息,輸出內容爲JSON格式。而且由不一樣顏色組成,便於識別。通常而言

  • 綠色表明執行成功,系統保持原樣

  • ×××表明系統表明系統狀態發生改變

  • 紅色表明執行失敗,顯示錯誤輸出。


Playbook案例剖析

實例:

---
- hosts: all
  sudo: yes

  tasks:
   - name: 安裝Apache
     yum: name={{ item }} state=present
     with_items:
     - httpd
     - httpd-devel
   - name: 複製配置文件
     copy:
       src: "{{ item.src }}"
       dest: "{{ item.dest }}"
       owner: root
       group: root
       mode: 0644
     with_items:
     - {
       src: "/tmp/httpd.conf",
         dest: "/etc/httpd/conf/httpd.conf" }
     - {
       src: "/tmp/httpd-vhosts.conf",
       dest: "/etc/httpd/conf/httpd-vhosts.conf"
       }
   - name: 檢查Apache運行狀態,並設置開機啓動
     service: name=httpd state=started enabled=yes

Playbook案例逐行剖析

如今咱們已經對playbook有了一個大概的瞭解,接一下,讓咱們詳細解剖一下上面的playbook都作了是什麼以及怎麼工做的。

  • 1    第一行,「---」,這個是YAML語法中註釋的用法,就像shell腳本中的「#」號同樣

  • 2    第二行,「- hosts: all」,告訴ansible具體要在哪些主機上運行個人劇本(playbook),在本例中是all,即全部主機

  • 3    第三行,「sudo:  yes」,告訴ansible經過sudo來運行相應命令,這樣全部命令將會以root身份執行

  • 4    第四行,「tasks:」,指定一系列將要運行的任務

每個任務(play)以「- name: 安裝Apache」開頭。
「- name:」字段並非一個模塊,不會執行任務實質性的操做,它只是給「task」 一個易於識別和名稱。
即使把name字段對應的行徹底刪除,也不會有任何問題。
本例中咱們使用yum模塊來安裝Apache,替代了「yum -y install httpd httpd-devel」
在每個play當中,均可以例用 with_items 來定義變量,並經過「{{ 變量名 }}」的形式來直接使用使用yum模塊的state=present選項來確保軟件被安裝,或者使用state=absent來確保軟件被刪除
第二個任務(play)一樣是「- name」字符開頭
咱們使用copy模塊來將「src」定義的源文件(必須是ansible所在服務器上的本地文件 )複製到「dest」定義的目的地址(此地址爲遠程主機的上地址)去,在傳遞文件的同時,還定義了文件的屬主,屬組和權限
這個play中,咱們用數組的形式給變量賦值,使用{var1: value, var2: value} 的格式來賦值,變量的個數能夠任意多,不一樣變量間以逗號分隔,使用{{item.var1 }}的形式來調用變量,本例中爲:{{ item.src }}

第三個任務(play)使用了一樣的結構,調用了service模塊,以保證服務的正常開啓。


執行playbook文件

 運行playbook,使用ansible-playbook命令
                (1) 檢測語法
                    ansible-playbook  --syntax-check  /path/to/playbook.yaml
                (2) 測試運行
                    ansible-playbook -C /path/to/playbook.yaml
                        --list-hosts   # 列出主機
                        --list-tasks  # 列出任務
                        --list-tags   # 列出標籤
                (3) 運行
                    ansible-playbook  /path/to/playbook.yaml
                        -t TAGS, --tags=TAGS
                        --skip-tags=SKIP_TAGS
                        --start-at-task=START_AT

                        

在執行playbook前,能夠作些檢查
檢查palybook語法
ansible-playbook -i hosts httpd.yml --syntax-check
列出要執行的主機
ansible-playbook -i hosts httpd.yml --list-hosts
列出要執行的任務
ansible-playbook -i hosts httpd.yml --list-tasks

debug你的playbook

檢查語法:ansible-playbook --syntax-check playbook.yml 
查看host列表:ansible-playbook --list-hosts playbook.yml
查看task列表:ansible-playbook --list-tasks playbook.yml
檢查模式(不會運行): ansible-playbook --check playbook.yml
diff模式(查看文件變化): ansible-playbook --check --diff playbook.yml
從指定的task開始運行:ansible-playbook --start-at-task="install packages" playbook.yml
逐個task運行,運行前須要你確認:ansible-playbook --step playbook.yml
指定tags:ansible-playbook --tags=foo,bar playbook.yml
跳過tags:ansible-playbook --skip-tags=baz,quux playbook.yml

實例:

[root@John ~]# cat web.yml
- hosts: webservers  ##主機組,在/etc/ansible/hosts中定義
  remote_user: root  ##遠程執行任務的用戶
  tasks:   ##任務
  - name: install httpd   ##任務描述
    command: yum -y install httpd  ##調用ansible的command模塊安裝httpd
  - name: provide httpd.conf   ##任務描述
    copy: src="/root/httpd.conf" dest="/etc/httpd/conf/httpd.conf"  ##調用ansible的copy模塊,httpd安裝完成後將事先準備好的httpd.conf文件複製到目標主機的/etc/httpd/conf/目錄下
    tags: conf  ##給此任務打標記,可單獨執行標記的任務,使用ansible-playbook -C 命令執行
    notify:  ##文件內容變動通知
    - server restart  ##通知到指定的任務
  - name: server start  ##任務描述
    service: name=httpd state=started enabled=true  ##調用ansible的service模塊的屬性定義安裝完成httpd之後httpd服務的管理
  handlers:  ##定義接受關注的資源變化後執行的動做
  - name: server restart  ##任務描述
    service: name=httpd state=restarted  ##當關注的資源發生變化後調用service模塊,採起相應的動做
  
##執行過程以下:
[root@mail ~]# ansible-playbook web.yml
 
PLAY [webservers] ************************************************************* 
 
GATHERING FACTS *************************************************************** 
ok: [node2]
ok: [node1]
 
TASK: [install httpd] ********************************************************* 
changed: [node2]
changed: [node1]
 
TASK: [provide httpd.conf] **************************************************** 
changed: [node2]
changed: [node1]
 
TASK: [server start] ********************************************************** 
changed: [node2]
changed: [node1]
 
NOTIFIED: [server restart] **************************************************** 
changed: [node2]
changed: [node1]
 
PLAY RECAP ******************************************************************** 
node1                      : ok=5    changed=4    unreachable=0    failed=0   
node2                      : ok=5    changed=4    unreachable=0    failed=0

任務列表和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

handlers的用法

 用於當關注的資源發生變化時採起必定的操做。
 
「notify」這個action可用於在每一個play的最後被觸發這樣能夠避免屢次有改變發生時每次都執行指定的操做取而代之僅在全部的變化發生完成後一次性地執行指定操做。在notify中列出的操做稱爲handler也即notify中調用handler中定義的操做。
 
 handlers:由特定條件觸發的Tasks;
    調用及定義方式:
        tasks:
        - name: TASK_NAME
          module: arguments
          notify: HANDLER_NAME
        handlers:
        - name: HANDLER_NAME
          module: arguments

        示例:
        - hosts: websrvs
          remote_user: root
          tasks:
          - name: install httpd package
            yum: name=httpd state=latest
          - name: install conf file
            copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
            notify: restart httpd service
          - name: start httpd service
            service: name=httpd state=started
          handlers:
            - name: restart httpd service
              service: name=httpd state=restarted

tags的用法

tags用於讓用戶選擇運行或路過playbook中的部分代碼。ansible具備冪等性所以會自動跳過沒有變化的部分即使如此有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時若是確信其沒有變化就能夠經過tags跳過此些代碼片段。
 
示例基於playbooks實現web服務的部署
一、提供好Inventory文件
# /etc/ansible/hosts基於祕鑰認證
[webhosts]
172.16.10.22
172.16.10.33
 
二、編輯 palybooks 劇本
# vim  /root/web.yaml
- name: web service
  remote_user: root
  hosts: webhosts
  vars:
    packages: httpd
  tasks:
    - name: install httpd      yum: name={{ packages }} state=present
      tags: install
    - name: configuration httpd
      copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags: conf
      notify:
        - restart httpd
    - name: service httpd start
      service: name=httpd enabled=no state=started
      tags: start
    - name: add centos and hadoop user
      user: name={{ item }} state=absent
      tags: adduser
      with_items:
        - centos
        - hadoop
  handlers:
        - name: restart httpd
          service: name=httpd state=restarted
 
三、準備好配置文件
 將web的配置放到指定目錄 src=/root/httpd.conf
 
四、開始部署
ansible-playbooks /root/web.yml

角色 ROLE

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的文件,其定義了此角色的任務列表;此文件可使用in
clude包含其它的位於此目錄中的task文件;
files目錄:存放由copy或script等模塊調用的文件;
templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;
handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler
中使用include包含的其它的handler文件也應該位於此目錄中;
vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;
meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係;
default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;


若是區分環境使用角色,可使用下列文檔結構

1240

role下有不少結構,ansible會自動按照文件結構進行加載解析。具體目錄結構以下:

.
├── defaults
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars

若是roles/x/tasks/main.yml存在,則自動將裏面的tasks添加到play中。

若是roles/x/handlers/main.yml存在,則自動將裏面的handlers添加到play中。

若是roles/x/vars/main.yml存在, 則自動將其中的variables添加到play中。

若是roles/x/meta/main.yml存在,則添加role的依賴關係roles中。

任何copy任務、script任務均可以引用roles/x/files中的文件,不管是使用絕對或相對路徑均可以。

任何template任務均可以引用roles/x/templates中的文件,不管絕對或相對路徑。

任何include任務均可以引用roles/x/tasks/中的文件,不管相對或絕對路徑


基於Role實現 lamp 平臺的批量部署

實驗環境:

控制端:
172.16.10.9 server.magedu.com
 
被控制端:
172.16.10.22 node2.example.com
172.16.10.33 node3.example.com
172.16.0.50 director1.example.com
172.16.0.51 director2.example.com
 
計劃:
172.16.10.22 node2.example.com
172.16.10.33 node3.example.com
# 安裝 web php程序,並提供配置文件
172.16.0.50 director1.example.com
172.16.0.51 director2.example.com
# 安裝 mysql mysql-server,並提供配置文件
 
要求:基於主機名通訊(被控制端均可以解析到其餘的主機名)

配置步驟:

一、配置好 Inventory 文件
# /etc/ansible/hosts
[webhosts]
node2.example.com
node3.example.com
 
[mysql]
director1.example.com
director2.example.com
 
二、建立對應的目錄樹
# 執行 tree /root/lamp/roles 查看目錄樹
/root/lamp/roles
|-- common
|   |-- default
|   |-- files
|   |   `-- hosts
|   |-- handlers
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
|-- db
|   |-- default
|   |-- files
|   |   `-- my.cnf
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
|-- db.yml
|-- php
|   |-- default
|   |-- files
|   |   `-- php.ini
|   |-- handlers
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
|-- site.yml
|-- web
|   |-- default
|   |-- files
|   |   `-- httpd.conf
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   `-- vars
`-- web.yml
 
 
 
三、各個文件的內容
# 當前所在目錄 /root/lamp/roles
# cat db.yml
- name: mysqld servise
  remote_user: root
  hosts: mysql
  roles:  
    - common 
    - db
 
# cat web.yml
- name: wed servise
  remote_user: root
  hosts: webhosts
  roles: 
    - common 
    - php  
    - web
     
# cat common/files/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.10.22 node2.example.com
172.16.10.33 node3.example.com
172.16.0.50 director1.example.com
172.16.0.51 director2.example.com
 
# cat common/tasks/main.yml
- name: Configure hostname resolve
  copy: src=hosts dest=/etc/hosts
 
# cat php/tasks/main.yml
- name: install php  
  yum: name=php state=present
- name: configuration php
  copy: src=php.ini dest=/etc/php.ini
 
# cat web/tasks/main.yml
- name: install httpd  
  yum: name=httpd state=present
- name: configuration httpd
  copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  notify:
    - restart httpd
- name: service httpd start
  service: name=httpd enabled=no state=started
 
# cat web/handlers/main.yml
- name: restart httpd
  service: name=httpd state=restarted
 
# cat db/tasks/main.yml
- name: install mysql
  yum: name=mysql state=present
- name: install mysql-server
  yum: name=mysql-server state=present
- name: configuration mysqld
  copy: src=my.cnf dest=/etc/my.cnf
  notify:
    - restart mysqld
- name: service mysqld start
  service: name=mysqld enabled=no state=started
 
# cat db/handlers/main.yml
- name: restart mysqld
  service: name=mysqld state=restarted
   
四、開始批量部署
ansible-playbooks web.yml
ansible-playbooks db.yml

ansible的roles配置nginx

一、準備目錄
# mkdir -pv playbook/roles/nginx/{default,files,handlers,meta,tasks,templates,vars}
二、準備nginx的配置文件
# cd roles/nginx/templates
# ansible all -m setup |grep ansible_processor_cores
        "ansible_processor_cores": 1,  \\獲取ansible的要調用的相關函數
        "ansible_processor_cores": 1,  \\獲取ansible的要調用的相關函數
# vim nginx.conf
worker_processes {{ ansible_processor_cores }}; \\調用獲取到的函數
三、準備Nginx的default.conf文件及rpm包
# ll nginx/files/
-rw-r--r-- 1 root root   2685 Jan 18 15:51 default.conf
-rw-r--r-- 1 root root 319456 Jan 18 15:52 nginx-1.4.7-1.el6.ngx.x86_64.rpm
四、在tasks目錄中配置任務列表
# cd nginx/tasks/
# vim main.yml
 - name: copy nginx.rpm
    copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm  dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
  - name: install nginx
    shell: yum -y  install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
  - name: provides nginx.conf
    template: src=nginx.conf  dest=/etc/nginx/nginx.conf
    tags: nginxconf
     
    notify:
    - server restart
  - name: provides default.conf
    copy: src=default.conf dest=/etc/nginx/conf.d/default.conf 
    tags: nginxconf
  - name: server start
    service: name=nginx enabled=true state=started
五、在handlers目錄中配置定義handler信息
# cd nginx/handlers/
# vim main.yml
- name: server restart
  service: name=nginx  state=restarted
六、在roles同一級目錄中建立site.yml文件
- hosts: webservers
  remote_user: root
  roles:
  - nginx
七、應用配置
# ansible-playbook site.yml 
 
PLAY [webservers] ************************************************************* 
 
GATHERING FACTS *************************************************************** 
ok: [node2]
ok: [node1]
 
TASK: [nginx | copy nginx.rpm] ************************************************ 
ok: [node1]
ok: [node2]
 
TASK: [nginx | install nginx] ************************************************* 
changed: [node1]
changed: [node2]
 
TASK: [nginx | provides nginx.conf] ******************************************* 
changed: [node2]
changed: [node1]
 
TASK: [nginx | provides default.conf] ***************************************** 
changed: [node2]
changed: [node1]
 
TASK: [nginx | server start] ************************************************** 
changed: [node2]
changed: [node1]
 
NOTIFIED: [nginx | server restart] ******************************************** 
changed: [node1]
changed: [node2]
 
PLAY RECAP ******************************************************************** 
node1                      : ok=7    changed=5    unreachable=0    failed=0   
node2                      : ok=7    changed=5    unreachable=0    failed=0   
八、查看webservers主機上是否已經啓動nginx
# ansible webservers -m shell -a 'netstat -tnlp'
node2 | success | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5497/nginx          
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1174/sshd           
tcp        0      0 :::22                       :::*                        LISTEN      1174/sshd           
 
node1 | success | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5513/nginx          
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1174/sshd           
tcp        0      0 :::22                       :::*                        LISTEN      1174/sshd     
九、查看playbook目錄整體結構:
# tree playbook/
playbook/
├── roles
│   └── nginx
│       ├── default
│       ├── files
│       │   ├── default.conf
│       │   └── nginx-1.4.7-1.el6.ngx.x86_64.rpm
│       ├── handlers
│       │   └── main.yml
│       ├── meta
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       │   └── nginx.conf
│       └── vars
└── site.yml


資料


Playbooks 採用YMAL 語法結構,基本的YMAL 語法請參考
http://docs.ansible.com/YAMLSyntax.html

python利用pyyaml模塊進行解析yaml語言
http://pyyaml.org/wiki/PyYAMLDocumentation

yaml格式在線檢查
http://yaml-online-parser.appspot.com/

相關文章
相關標籤/搜索