ansible playbook最佳實踐

本篇主要是根據官方翻譯而來,從而使簡單的翻譯,並無相關的實驗步驟,之後文章會補充爲實驗步驟,此篇主要是相關理論的說明,能夠稱之爲中文手冊之一,具體內容以下:git

Ansible playbooks最佳實踐

本文檔主要闡述如何來寫最好的playbook,在以下網址中能找到相關的例子,以下:github

https://github.com/ansible/ansible-examplesweb

在使用playbooks的最佳路徑中,最好的方法是使用roles,這是最好的方法,在官方文檔中,至少強調了三篇,從而在使用playbooks的時候,最好就是使用roles來進行組織playbook。centos

一、    目錄結構

在使用roles進行組織的時候,是具備目錄結構的,目錄結構的使用也是將playbooks進行組織,在使用include的時候,主要是爲了重用的目的,從而將複雜的playbook進行分割成小的,從而達到重用的目的,以下所示,表示爲roles的目錄組織結構。服務器

production                # 生產環境服務器的列表(inventory file架構

staging                   # 測試環境服務器列表(inventory fileapp

 

group_vars/工具

   group1                 # 對特定的組分配變量佈局

   group2                 # ""測試

host_vars/

   hostname1              # 主機特定變量

   hostname2              # ""

 

library/                  # 客戶端模塊(可選)

filter_plugins/           # 客戶端過濾模塊(可選)

 

site.yml                  # master playbook

webservers.yml            # webserver playbook

dbservers.yml             # dbserver playbook

 

roles/

    common/               # 此層表示爲一個 "role"

        tasks/            #

            main.yml      #  <-- 任務文件

        handlers/         #

            main.yml      #  <-- handlers文件

        templates/        #  <-- 模板文件位置

            ntp.conf.j2   #  <------- 模板後綴符 .j2

        files/            #

            bar.txt       #  <-- 拷貝文件資源

            foo.sh        #  <-- script文件腳本資源

        vars/             #

            main.yml      #  <-- role相關聯的變量

        defaults/         #

            main.yml      #  <-- 默認狀況下優先級比較低的變量

        meta/             #

            main.yml      #  <-- role的依賴

 

    webtier/              # webtierrole,和commanrole結構相同    monitoring/           # ""

    fooapp/               # ""

 

二、    使用動態inventory

在使用雲的時候,能夠不使用靜態的inventory文件,可使用動態的inventory文件。

三、    如何區分測試環境和生產環境

在測試環境和生產環境的管理中,主要用不一樣的inventory文件來進行區分。

 

在進行使用playbook的時候,最好在測試環境中進行測試,而後再在生產環境中進行執行。

 

在管理靜態的inventory文件的時候,若是來區分生產環境和測試環境,主要就是使用前綴名,以下所示

# file: production
 
[atlanta-webservers]
www-atl-1.example.com
www-atl-2.example.com
 
[boston-webservers]
www-bos-1.example.com
www-bos-2.example.com
 
[atlanta-dbservers]
db-atl-1.example.com
db-atl-2.example.com
 
[boston-dbservers]
db-bos-1.example.com
 
# webservers in all geos
[webservers:children]
atlanta-webservers
boston-webservers
 
# dbservers in all geos
[dbservers:children]
atlanta-dbservers
boston-dbservers
 
# everything in the atlanta geo
[atlanta:children]
atlanta-webservers
atlanta-dbservers
 
# everything in the boston geo
[boston:children]
boston-webservers
boston-dbservers

 

 

         在上圖中,都使用相同的前綴名,從而來區分各個主機。

在進行管理不一樣環境的主機的時候,推薦的作法是使用不一樣的前綴名來進行區分主機環境,從而作到可讀性比較強

四、    組和主機變量

組是比較容易管理的,可是並非全部組都是這樣的,一樣能夠對組的變量進行設置,在下面例子中,atlanta有其本身的變量,從而定義以下:

---
# file: group_vars/atlanta
ntp: ntp-atlanta.example.com
backup: backup-atlanta.example.com

 

在進行設置組變量的時候,能夠根據不一樣組的屬性從而來劃分各個不一樣的變量,當具備默認屬性的時候,那麼能夠將變量值設置在一下目錄中,group_vars/all,以下所示:

---
# file: group_vars/all
ntp: ntp-boston.example.com
backup: backup-boston.example.com

 

也能夠在目錄host_vars中定義具體的系統變量,可是應當儘可能避免此種狀況的發生,以下圖所示:

---
# file: host_vars/db-bos-1.example.com
foo_agent_port: 86
bar_agent_port: 99

 

五、    最高層的playbook劃分爲role

在site.yml中,可使用include一個playbook來表述一個總體的結構,注意在整個裏面是很簡短的,以下所示,playbooks是包含一系列的playbook:

---
# file: site.yml
- include: webservers.yml
- include: dbservers.yml

 

在文件webserver.yml中,也就是配置這個組所對應的role,以下所示:

---
# file: webservers.yml
- hosts: webservers
  roles:
    - common
    - webtier

 

在進行運行的時候,咱們可使用site.yml來進行或者使用單獨的webserver.yml來運行,以下就是來進行明確運行哪一個playbook:

ansible-playbook site.yml --limit webservers
ansible-playbook webservers.yml

 

六、    在role中來組織task和handler

如下例子中演示如何使用一個role來進行工做,在這裏能夠作不少,以下所示:

---
# file: roles/common/tasks/main.yml
 
- name: be sure ntp is installed
  yum: name=ntp state=installed
  tags: ntp
 
- name: be sure ntp is configured
  template: src=ntp.conf.j2 dest=/etc/ntp.conf
  notify:
    - restart ntpd
  tags: ntp
 
- name: be sure ntpd is running and enabled
  service: name=ntpd state=running enabled=yes
  tags: ntp

下面的例子中,表示爲一個handler,以下所示:

---
# file: roles/common/handlers/main.yml
- name: restart ntpd
  service: name=ntpd state=restarted

 

七、    組織結構如何啓用

在上面的roles組織中,如何開啓這種佈局結構

若是要從新配置組織架構,只要執行下面的命令便可:

ansible-playbook -i production site.yml

 

 

若是要從新配置NTP,執行下面命令便可:

ansible-playbook -i production site.yml --tags ntp

 

 

若是要從新配置webservers,以下:

ansible-playbook -i production webservers.yml

 

 

若是要從新配置boston的webservsers,以下:

ansible-playbook -i production webservers.yml --limit boston

 

 

若是要從新配置前十個和下十個,以下:

ansible-playbook -i production webservers.yml --limit boston[0-10]
ansible-playbook -i production webservers.yml --limit boston[10-20]

 

 

若是要執行臨時任務,以下:

ansible boston -i production -m ping
ansible boston -i production -m command -a '/sbin/reboot'

 

 

比較有用的指令以下:

# confirm what task names would be run if I ran this command and said "just ntp tasks"
ansible-playbook -i production webservers.yml --tags ntp --list-tasks
 
# confirm what hostnames might be communicated with if I said "limit to boston"
ansible-playbook -i production webservers.yml --limit boston --list-hosts

八、    使用state

在有的模塊中,state是有默認值得,可是在playbook中最好是明確的標示state的狀態是present仍是absent,而且在state還有其餘值得時候,明確指定state的值有利於可讀性。

九、    操做系統和發行版變量

若是是針對的是不一樣操做系統的變量,最好的方法是使用group_by模塊。這樣會對動態的主機進行確認,雖然不在inventory文件中,以下:

---
 
# talk to all hosts just so we can learn about them
- hosts: all
  tasks:
     - group_by: key=os_{{ ansible_distribution }}
 
# now just on the CentOS hosts...
 
- hosts: os_CentOS
  gather_facts: False
  tasks:
     - # tasks that only happen on CentOS go here

 

這樣會造成將全部的系統造成一個動態組,基於操做系統的名稱。

 

若是須要特殊的設置組,那麼以下所示:

---
# file: group_vars/all
asdf: 10
 
---
# file: group_vars/os_CentOS
asdf: 42

 

上例中,表示出了centos的機器得到的值爲10,centos的機器得到值爲42

 

也能夠設置如下的變量:

- hosts: all
  tasks:
    - include_vars: "os_{{ansible_distribution}}.yml"
    - debug: var=asdf

 

此種變量是基於操做系統的名稱

十、 其餘

在使用的時候,注意用空格來進行分割不一樣的內容;

使用#來進行註釋;

在書寫playbook的時候,name最好是寫上,從而代表相關的目的;

儘可能保持playbook的簡潔性;

控制版本。

在進行變量設置的時候,最好放在相關的目錄中,而且可使用grep等相關的工具來查找到變量位置。

相關文章
相關標籤/搜索