1. 程式人生 > 實用技巧 >ansible playbook

ansible playbook

一、 yaml語法簡介

在單一檔案中,可用連續三個連字元號(---)區分多個檔案

次行開始正常寫playbook的內容,一般建議寫明該playbook的功能

使用#註釋

縮排必須是統一的,不能空格和tab混用

縮排的級別必須是一致的,同樣的縮排達標同樣的級別,

yaml我呢見區分大小寫

多個k/v可同行寫也可換行寫,同行使用逗號分隔

v可以是字串,也可以是另一個列表

一個完成的程式碼塊功能需最少元素包括name和task

一個name只能包括一個task

yaml副檔名通常為yml或yaml

List: 列表,其所有嚴肅均使用”-“ 大頭

Dictionary: 字典,通常由多個key與value構成,也可以放置於{}中

二、Playbook核心元素

hosts 執行的遠端主機列表

tasks 人物集

varniables 內建變數或自定義變數在playbook中呼叫

template 模板,可替換模板檔案中變數並實現一些簡單邏輯檔案

handlers和notity結合使用,由特定條件觸發的操作,滿足條件方才執行

tags 標籤,指定某條任務執行,用於選擇執行行ploybook中的部分程式碼

三、playbook基礎元件

remote_user: 可用於host和task中。也可以指定通過指定其通過sudo的方式在遠端主機上執行任務,其可用於play全域性或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的使用者

- hosts: webserver
remote_user: rooot
tasks:
- name: test connection
ping
sudo: yes
sudo_user:wang

執行playboook

ansible-playbook filename.yaml [options]

常見選項

--check -C 只檢測可能會發生的改變,但不真正執行操作

--list-hosts 列出執行任務的主機

--list-tags 列出tag

--list-tasks 列出task

--limit 主機列表 只正對主機列表中的主機執行

-v -vv -vvv 顯示過程

編寫安裝httpd的playbook例子

---
- hosts: server
remote_user: root

tasks:
- name: install
yum: name=httpd
- name: config
copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
- name: service
service: name=httpd state=started enabled=yes

二進位制安裝mariadb

---
- hosts: appserver
remote_user: root

tasks:
- name: user
user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin
- name: unarchive
   unarchive src=壓縮包 dest=/usr/local owner=mysql group=root
- name: mysql link
file: src=解壓後文件夾 dest=路徑 state=link
- name: create director
file: /data/mysql state=director
- name owner group
file: path=/data/mysql owner=mysql group=mysql
- name: mysql database
shell: chdir=路徑/scripts scripts/mysql_install_db --datadir=/data/mysql --user=mysql
- name: path
file: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: config
   copy: 拷貝檔案
- name: service
- name: start service
(自己補充去...)

handlers和notify 結合使用觸發條件

handlers

是task列表,這些task與前述的task並沒有本質上的不同,用於當關注的資源發生變化時,才會採取一定的操作

notify此action可用於在每個play的最後被觸發,避免多次有改變發生時每次都執行指定的操作,在notify中列出的操作都成為handler

---
- hosts: server
remote_user: root

tasks:
- name: install
yum: name=httpd
- name: config
copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd
- name: service
service: name=httpd state=started enabled=yes
handler:
- name: restart httpd
service: name=httpd state=restarted

playbook中tags的使用

給某一個動作加一個標籤,後面可以挑著執行

- hosts: server
remote_user: root

tasks:
- name: install
yum: name=httpd
- name: config
copy: src=/data/playbook/httpd.conf dest=/etc/httpd/conf/
   tags: copy
notify: restart httpd
- name: service
service: name=httpd state=started enabled=yes

執行: ansible-playbook -t copy httpd.yaml

playbook中變數使用

呼叫變數: 兩個花括號

變數名: 僅能由字母、數字和下劃線組成,且只能以字母開頭

變數來源:

  1. ansible setup facts 遠端主機的所有變數都可以直接呼叫  

    setup模組: 顯示主機上的各種資訊

    ansible all -m setup -a 'filter=ansible_fqdn'

   2. 在/etc/ansible/hosts中定義

   普通變數:主機組中主機單獨定義,優先順序高於公共變數

公共組變數:針對主機組中所有主機定義統一變數

    [webserver]

    ip

    [webserver:vars]

    ntp_server=ntp.cn.com

    ngs_server=nfs.cn.com

   3. 通過命令列指定變數,優先順序最高

    ansible-playbook -e varname=value

   4. 在playbook中定義

    vars

     - var1: value1

     - var2: value2

   5. 在獨立的變數yaml檔案中定義  

    hostname: testnode
    suf: log

    呼叫:在檔案裡面寫上檔案 vars_fies: vars.yml

   6.在role中定義

模板template

文字檔案,巢狀有指令碼(使用模板變成語言編寫)

Jinjia2語言, 使用字面量,有下面形式

  字串:使用單引號或雙引號

  數字: 整數,浮點數

  列表:[item1, item2,...]

  元組: (item1, item2,...)

  字典: {key1: value1, key2: value2}

  布林型: true/false

  算術運算:+, -, *, /, //, %, **

  比較運算:==, !=, >, >=, <, <=

  邏輯運算: and, or, not

  流表示式: for, if, when

template功能: 根據模組檔案動態生成對應的配置檔案

  template檔案必須存放於templates目錄下,且命名為.j2結尾

  yaml/yml檔案需和templates目錄平級,結果如下

  ./

    temnginx.yml

    templates

      nginx.conf.j2

  應用在yml的tasks下

    template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

    ps: 主要按照格式來寫,src直接寫檔名即可

when 類似if

條件測試:如果需要根據變數、facts或此前任務的執行結果來作為或task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinjia2語法格式

when語句

  在task後新增when子句即可使用條件測試;when語句支援jinjia2

  

迭代: with_items

迭代:當有需要重複性執行的讓你無時,可以使用迭代機制

  對迭代項的引用,固定變數名為 item

  要在task中使用with_items給要迭代的元素列表

  列表格式:

    字串

    字典

  示例

  - name: add serveral users

   user: name={{item}} state=present group=wheel

   with_items:

   - testuser1

    - testuser2

playbook中template for if

roles

ansible 1.2版本引入的新特性,用於層次化,結構化的組織playbook,roles能夠根據層次型結構自動裝載變數檔案、task及handlers等,要使用roles只需要在playbook中使用include指令即可。roles就是將變數、檔案、任務、模板及處理器放置於單獨的目錄中,並可以便捷的include他們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護程序等場景中

複雜場景: 建議使用roles, 程式碼服務度高

  變更指定主機或主機組

  如命名不規範維護和傳承成本大

  某些功能需要多個playbook, 通過include即可

角色: 角色集合

  usercof.yml

  roles/

    mysql/

      tasks

        main.yml

        create_dir.yml

        static_dir.yml

      files

        main.yml

      vars

        main.yml

    httpd/

roles各目錄作用

以nginx為例

mkdir roles/nginx/{tasks,files} -pv

cd roles/nginx/

vim tasks/user.yml

- name: create user
user: name=nginx shell=/sbin/nologin system=yes create_home=no

vim install.yml

- name: install
yum: name=nginx

cp /usr/local/nginx/conf/nginx.conf.default /data/ploybook/roles/nginx/files/

vim sysconfig.yml

- name: config
copy: src=nginx.conf dest=/etc/nginx/

vim service.yml

- name: service
service: name=nginx state=started enabled=yes

vim main.yml

- include: user.yml
- include: install.yml
- include: config.yml
- include: service.yml

vim nginx_role.yml

- hosts: appservers
roles:
- role: nginx

引用

ansible-playbook nginx_role.yml

目錄結構