Ansible之playbook

簡介

playbook是一個很是簡單的配置管理和多主機部署系統。可做爲一個適合部署複雜應用程序的基礎。
playbook能夠定製配置,能夠按指定的操做步驟有序執行,支持同步和異步方式。
playbook是經過YAML格式來進行描述定義的,可實現多臺主機應用的部署,對不一樣分組的主機執行特定指令步驟。node

 

playbook經過示例展現其用法

定製一個簡單的Nginx軟件包管理,內容包括安裝、配置模板、狀態管理等。

配置文件:nginx.ymllinux

---
- hosts: webservers #hosts參數做用:定義操做的對象,本例操做對象爲webservers組

vars: #vars參數做用:定義變量(配置模板時會用到),做用域只限於webservers組
  worker_processes: 4
  num_cpus: 4
  max_open_file: 65506
  root: /data

remote_user: root #指定遠程操做的用戶名,默認是root,支持sudo運行,經過添加sudo:yes便可

tasks: #定義任務列表(自上而下順序執行)
  - name: ensure nginx is at the latest version #每一個事務均可以定義一個name標籤,好處是加強可讀性,便於觀察結果輸出時瞭解運行的位置
    yum: pkg=nginx state=latest #yum安裝最新版本的nginx
  - name: write the nginx config file 
    template: src=/home/test/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf #根據模板配置nginx配置文件,src爲主控端模板路徑,dest爲被控端nginx配置文件路徑
    notify: 
      - restart nginx
  - name: ensure nginx is running
    service: name=nginx state=started #啓動nginx

handlers: #通知處理程序(必需要有notify觸發纔會執行),根據notify選擇handlers中對應的name標籤,從而進行相應操做。如notify中是restart nginx,則handlers中的name標籤內容也是restart nginx,才能執行
  - name: restart nginx
    service: name=nginx state=restarted

 

模板:nginx2.confnginx

user    nginx;
worker_processes    {{ worker_prcesses }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_flimit_notifile {{ max_open_file }};
... ...

 

執行playbook

格式:web

ansible-playbook playbook.yml(playbook文件,可自定義名稱) [參數]

例:app

ansible-playbook /home/test/ansible/playbooks/nginx.yml -f 10 #啓用10個並行進程數執行playbook(nginx.yml)

 

經常使用參數:運維

-u REMOTE_USER   #手工指定playbook的系統用戶
--syntax-check   #檢查playbook的語法
--list-hosts playbook   #匹配到的主機列表
-T TIMEOUT   #定義playbook執行超時時間
--step   #以單任務分步驟運行,方便作每一步確認工做
--help   #幫助信息

 

playbook角色與包含聲明

包含

當playbook文件很是大時,想要複用某些功能是就會顯得至關吃力,Ansible支持寫playbook文件時拆分紅多個文件,經過包含(include)的形式進行引用。
例:
功能(複用)文件:tasks/fool.yml異步

---
#possibly saved as tasks/foo.yml
- name: placeholder foo
  command: /bin/foo
- name: placeholder bar
  command: /bin/bar

使用的playbook文件:playbook.ymlspa

tasks:
  - include: tasks/foo.yml #經過include來引用複用的功能

 

 角色

角色:Ansible定製好的一種標準規範,以不一樣級別目錄層次及文件對角色、變量、任務、處理程序等進行拆分,爲後續功能擴展、可維護性打下基礎。
例:
以上面的nginx.yml爲例進行拆分,結構以下:

 rest

說明:

hosts    code

#自定義主機,非必選項,默認將引用/etc/ansible/hosts的參數,要引用自定義hosts,須要經過-i file參數來實現,如:ansible-playbook -i hosts

[webservers]
192.168.1.111
192.168.1.112

 

group_vars

#定義組變量目錄,目錄中的文件名要與組名保持一致,組變量文件定義的變量做用域只在該組內,不能做用到其餘組

【group_vars/all】 #表明全部主機

---
#Variables listed here are applicable to all host groups
ntpserver: ntp.sjtu.edu.cn

【group_vars/webservers】 #webservers組

---
worker_processes: 4
num_cpus: 4
max_open_file: 66535
root: /data

 

site.yml

#全局配置文件,下面內容引用了兩個角色塊,角色的應用範圍及實現功能都不同

---
- name: apply common configuration to all nodes
  hosts: all 
  roles:
    - common #對應目錄爲:nginx/roles/common
- name: configure and deploy the webservers and application code
  hosts: webservers 
  roles:
    - web #對應目錄爲:nginx/roles/web

 

roles

#角色目錄,一般每一個角色對應着一個特定的功能服務
【roles/common】
handlers/main.yml #處理程序文件

---
- name: restart ntp
  service: name=ntp state=restarted

tasks/main.yml #任務列表文件

---
- name: Install ntp
  yum: name=ntp state=present
- name: Configure ntp file
  template: src=ntp.conf.j2 dest=/etc/ntp.conf #引用模板無需寫路徑,默認在上級的templates目錄中查找
  notify: restart ntp
- name: Start the ntp service
  service: name=ntp state=started enabled=true
- name: test to see if selinux is running
  command: getenforce
  register: sestatus
  changed_when: false

templates/ngp.conf.j2 #模板

driftfile    /var/lib/ntp/drift
restrict    127.0.0.1
restrict    -6 ::1
server    {{ ntpserver }} #此處ntpserver引用vars/main.yml中定義的ntpserver變量
includefile    /etc/ntp/rypto/pw
keys    /etc/ntp/keys

vars/main.yml #變量配置文件

---
#Variable listed here are applicable to all host groups
ntpserver: 210.72.145.44

 

【roles/web】
handlers/main.yml #處理程序文件

---
- name: restart nginx
  service: name=nginx state=restarted

tasks/main.yml #任務列表文件

---
- name: ensure nginx is at the latest version #每一個事務均可以定義一個name標籤,好處是加強可讀性,便於觀察結果輸出時瞭解運行的位置
  yum: pkg=nginx state=latest #yum安裝最新版本的nginx
- name: write the nginx config file 
  template: src=/home/test/ansible/nginx/nginx2.conf dest=/etc/nginx/nginx.conf #根據模板配置nginx配置文件,src爲主控端模板路徑,dest爲被控端nginx配置文件路徑
  notify: 
    - restart nginx
- name: ensure nginx is running
  service: name=nginx state=started #啓動nginx

templates/nginx2.conf #模板

user    nginx;
worker_processes    {{ worker_prcesses }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_flimit_notifile {{ max_open_file }};
... ...

 

運行角色

ansible-playbook -i hosts site.yml -f 10 #啓用10個並行進程數執行playbook。hosts文件經過-i指向自定義hosts,playbook配置文件爲site.yml

 

 


參考資料:

根據劉天斯《Python自動化運維技術與最佳實踐》整理

相關文章
相關標籤/搜索