Ansible之playbook的使用總結 - 運維手冊

散盡浮華發表於2016-06-08

 

之前詳細介紹了Ansible的安裝, 配置, 以及Ansible常用模組的使用. 下面對Ansible的playbook用法做一小結.

為什麼引入playbook?
一般運維人員完成一個任務, 比如安裝部署一個httpd服務會需要多個模組(一個模組也可以稱之為task)提供功能來完成。而playbook就是組織多個task的容器,它的實質就是一個檔案,有著特定的組織格式,它採用的語法格式是YAML(Yet Another Markup Language)。YAML語法能夠簡單的表示雜湊表,字典等資料結構。簡單來說, playbook是由一個或多個模組組成的,使用多個不同的模組,完成一件事情。 

Ansible核心功能
-  pyYAML用於ansible編寫劇本所使用的語言格式(saltstack---python);
-  rsync-ini語法, sersync-xml語法, nsible-pyYAML語法;
-  paramiko遠端連線與資料傳輸;
-  Jinja2用於編寫ansible的模板資訊;

YAML三板斧
縮排: YAML使用一個固定的縮排風格表示層級結構,每個縮排由兩個空格組成, 不能使用tabs;
冒號: 以冒號結尾的除外,其他所有冒號後面所有必須有空格;
短橫線: 表示列表項,使用一個短橫槓加一個空格。多個項使用同樣的縮排級別作為同一列表;

YAML基本語法
列表:每一個列表成員前面都要有一個短橫線和一個空格

fruits:
    - Apple
    - Orange
    - Strawberry
    - Mango

或者:
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']

字典:每一個成員由鍵值對組成,注意冒號後面要有空格

martin:
    name: Martin D'vloper
    job: Developer
    skill: Elite
或者
martin: {name: Martin D'vloper, job: Developer, skill: Elite}

列表和字典可以混合使用

-  martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang

playbook基礎元件
Hosts:執行執行任務(task)的目標主機
remote_user:在遠端主機上執行任務的使用者
tasks:任務列表
handlers:任務,與tasks不同的是隻有在接受到通知時才會被觸發
templates:使用模板語言的文字檔案,使用jinja2語法。
variables:變數,變數替換{{ variable_name }}

整個playbook是以task為中心,表明要執行的任務。hosts和remote_user表明在哪些遠端主機以何種身份執行。其他元件讓其能夠更加靈活。下面介紹下這些外掛:

1.  variable
變數定義在資產 (inventory) 中, 預設就是/etc/ansible/hosts檔案中

主機變數:
192.168.200.136 http_port=808 maxRequestsPerChild=808
192.168.200.137 http_port=8080 maxRequestsPerChild=909

主機組變數:
[websers]
192.168.200.136
192.168.200.137

[websers:vars]  
ntp_server=ntp.exampl.com
proxy=proxy.exampl.com

變數定義在playbook中

- hosts: webservers
  vars:
    http_port: 80

使用facts變數

facts變數是由setup模組獲取遠端主機的資訊。

用法:
# ansible 192.168.200.136 -m setup

在roles中定義變數, 這個後面會介紹到.

ansible-playbook 命令中傳入引數

使用 -e選項傳入引數
# ansible-playbook 192.168.200.136 -e "httpd_port=808" httpd04.yml

變數的引用

{{ var_name }}

2.  templates
它是一個模組功能,與copy不同的是他的文字檔案採用了jinga2語法,jinga2基本語法如下:

字面量:
  字串:使用單引號或雙引號
  數字:整型,浮點數
  列表:{item1,item2,...}
  字典:{key1:value1,key2:value2,...}
  布林型:true/false
算術運算:
  +,-,*,/,//,%,**
比較運算:
  ==,!=,>,>=,<,<=
邏輯運算:
  and,or,not

注意:template只能在palybook中使用。

3.  tasks
執行的模組命令

格式:
  action:模組引數(此種方式只在較新的版本中出現)
  module:引數(已鍵值對的形式出現)

每一個task都有一個名稱,用於標記此任務。任務示例:
  name: install httpd
  yum: name=httpd state=present

注意:shell和command沒有引數,可在後面直接跟命令
  shell: ss -tnl | grep :80

1)某任務的執行狀態為changed後,可通過相應的notify通知相應的handlers
2)任務可以通過tags打標籤,然後通過palybook命令-t選項呼叫.

playbook呼叫方式

用法:
ansible-playbook  <filename.yml> ... [options]

<filename.yml>: yaml格式的playbook檔案路徑,必須指明
[options]: 選項

-C, --check:並不在遠端主機上執行,只是測試。
-i PATH, --inventory=PATH:資產的檔案路徑
--flush-cache:清楚fact快取
--list-hosts:列出匹配的遠端主機,並不執行任何動作
-t, TAGS, --tags=TAGS:執行指定的標籤任務
--skip-tags:跳過指定的notify,後面詳細介紹。

palybook書寫格式

- hosts: 172.16.60.211                #處理指定伺服器.   - (空格)hosts:(空格)172.16.20.211
  task:                               #劇本所要乾的事情; (空格)(空格)task:
  - name:                             #(兩個空格)-(空格)name:
    command: echo hello clsn linux    #(四個空格)command:(空格)        

palybook格式示例

[root@ansible-server ~]# vim /etc/ansible/test.yaml
- hosts: 172.16.60.213
  tasks:
    - name: Install Rsync
      yum: name=rsync state=installed

playbook檢查方法
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/test.yaml

playbook: /etc/ansible/test.yaml
[root@ansible-server ~]# ansible-playbook -C /etc/ansible/test.yaml

PLAY [172.16.60.213] *******************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************
ok: [172.16.60.213]

TASK [Install Rsync] *******************************************************************************************************************
ok: [172.16.60.213]

PLAY RECAP *****************************************************************************************************************************
172.16.60.213              : ok=2    changed=0    unreachable=0    failed=0  

上面兩個檢查命令, 第一個是進行playbook劇本配置資訊語法檢查; 第二個是模擬playbook劇本執行(彩排)

palybook劇本檔案示例

ansible-playbook編寫內容擴充套件劇本任務編寫多個任務

- hosts: all
  tasks:
    - name: restart-network
      cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
    - name: sync time
      cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

劇本編寫內容擴充套件:劇本任務編寫多個主機

- hosts: 172.16.60.7
  tasks:
    - name: restart-network
      cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
    - name: sync time
      cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

- hosts: 172.16.60.31
  tasks:
    - name: show ip addr to file
      shell: echo $(hostname -i) >> /tmp/ip.txt

playbook劇本編寫方式
-  多主機單任務編寫方式
-  多主機多工編寫方式
-  不同主機多工編寫方式

Ansible-playbook案例分享

1) 機器環境
角色                   外網ip                      內網ip                           部署軟體
m01                  eth0:10.0.0.61         eth1:172.16.1.61         ansible
backup              eth0:10.0.0.41         eth1:172.16.1.41         rsync
nfs                    eth0:10.0.0.31          eth1:172.16.1.31         nfs、Sersync
web01               eth0:10.0.0.7           eth1:172.16.1.7            httpd

2) 目錄規劃
[root@m01 ~]# mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p
[root@m01 ~]# tree /etc/ansible/ansible_playbook/
/etc/ansible/ansible_playbook/
├── conf
└── file
└── scripts

3) rsync配置檔案
準備對應的配置檔案存放至/etc/ansible/ansible_playbook/conf/
[root@m01 conf]# cat /etc/ansible/ansible_playbook/conf/rsyncd.conf
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################

[backup]
path = /backup
[data]
path = /data

4) nfs配置檔案
準備nfs配置檔案exports
[root@m01 ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/nfs_exports
/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

5) Sersync軟體包
下載Sersync軟體包
[root@m01 ansible_playbook]# ll /etc/ansible/ansible_playbook/file/
-rw-r--r-- 1 root root 727290 Aug  1 12:04 sersync.tar.gz

6) sersync配置檔案
準備sersync實時同步的配置檔案
[root@m01 ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs

7) 基礎環境部署
基礎環境:所有機器統一的配置
需要關閉firewalld以及selinux、epel倉庫、ssh埠、優化基礎配置
需要安裝rsync和nfs-utils
準備www使用者
需要準備/etc/rsync.pass密碼檔案
需要準備全網備份指令碼

基礎的playbook劇本
[root@m01 ansible_playbook]# cat base.yaml
- hosts: all
  tasks:
    - name: Install Epel Repos
      get_url: url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/epel.repo

    - name: Install Rsync Nfs-Utils
      yum: name=rsync,nfs-utils state=installed

    - name: Create Group WWW
      group: name=www gid=666

    - name: Create User WWW
      user: name=www uid=666 group=666 create_home=no shell=/sbin/nologin

    - name: Create Rsync_Client_Pass
      copy: content='1' dest=/etc/rsync.pass mode=600

    - name: Create Scripts Directory
      file: path=/server/scripts recurse=yes state=directory

    - name: Push File Scripts
      copy: src=./scripts/rsync_backup_md5.sh dest=/server/scripts/

    - name: Crontable Scripts
      cron: name="backup scripts" hour=01 minute=00 job="/bin/bash /server/scripts/rsync_backup_md5.sh &>/dev/null"

8) 應用環境:Rsync
安裝rsync
配置rsync(配置變更,一定要進行過載操作)
建立虛擬使用者,許可權調整
建立目錄/data/  /backup
啟動rsync
配置郵箱->郵箱的發件人->校驗的指令碼

[root@m01 ansible_playbook]# cat rsync.yaml
- hosts: backup
  tasks:
    - name: Installed Rsync Server
      yum: name=rsync,mailx state=installed

    - name: configure Rsync Server
      copy: src=./conf/rsyncd.conf dest=/etc/rsyncd.conf
      notify: Restart Rsync Server

    - name: Create Virt User
      copy: content='rsync_backup:1' dest=/etc/rsync.password mode=600

    - name: Create Data
      file: path=/data state=directory recurse=yes owner=www group=www mode=755

    - name: Create Backup
      file: path=/backup state=directory recurse=yes owner=www group=www mode=755

    - name: Start RsyncServer
      service: name=rsyncd state=started enabled=yes

    - name: Push Check Scripts
      copy: src=./scripts/rsync_check_backup.sh dest=/server/scripts/

    - name: Crond Check Scripts
      cron: name="check scripts" hour=05 minute=00 job="/bin/bash /server/scripts/rsync_check_backup.sh &>/dev/null"

9)  應用環境:NFS
安裝nfs-utils
配置nfs (當修改了配置,觸發過載操作)
建立目錄,授權
啟動

[root@m01 ansible_playbook]# cat nfs.yaml
- hosts: nfs
  tasks:
    - name: Installed Nfs Server
      yum: name=nfs-utils state=installed

    - name: Configure Nfs Server
      copy: src=./conf/exports dest=/etc/exports
      notify: Restart Nfs Server

    - name: Create Share Data
      file: path=/data state=directory recurse=yes owner=www group=www mode=755

    - name: Start Nfs Server
      service: name=nfs-server state=started enabled=yes

  handlers:
    - name: Restart Nfs Server
      service: name=nfs-server state=restarted

10) 應用環境:Sersync
下載sersync
解壓,改名,配置
啟動

[root@m01 ansible_playbook]# cat sersync.yaml
- hosts: nfs
  tasks:
    - name: Scp Sersync
      copy: src=./file/sersync2.5.4_64bit_binary_stable_final.tar.gz dest=/usr/local/sersync.tar.gz

    - name: Zip
      shell: cd /usr/local && tar xf sersync.tar.gz && mv GNU-Linux-x86 sersync
      args:
        creates: /usr/local/sersync

    - name: configure Sersync
      copy: src=./conf/confxml.xml dest=/usr/local/sersync/

    - name: Start Sersync
      shell: /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

11) 應用環境:WEB
掛載nfs共享的目錄

[root@m01 ansible_playbook]# cat web.yaml
- hosts: web
  tasks:
    - name: Mount NFS Server Share Data
      mount: src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted

12) 包含include
[root@m01 ansible_playbook]# cat mail.yaml
- import_playbook: base.yaml
- import_playbook: rsync.yaml
- import_playbook: nfs.yaml
- import_playbook: sersync.yaml
- import_playbook: web.yaml

13) 操作後測試步驟
快照還原
推送公鑰
使用ping模組測試
執行ansible-playbook測試
測試全網備份,測試是否能發郵件,並校驗結果
測試nfs的掛載
測試實時同步

相關文章