以前詳細介紹了Ansible的安裝, 配置, 以及Ansible經常使用模塊的使用. 下面對Ansible的playbook用法作一小結.python
爲何引入playbook?
通常運維人員完成一個任務, 好比安裝部署一個httpd服務會須要多個模塊(一個模塊也能夠稱之爲task)提供功能來完成。而playbook就是組織多個task的容器,它的實質就是一個文件,有着特定的組織格式,它採用的語法格式是YAML(Yet Another Markup Language)。YAML語法可以簡單的表示散列表,字典等數據結構。簡單來講, playbook是由一個或多個模塊組成的,使用多個不一樣的模塊,完成一件事情。 linux
Ansible核心功能
- pyYAML用於ansible編寫劇本所使用的語言格式(saltstack---python);
- rsync-ini語法, sersync-xml語法, nsible-pyYAML語法;
- paramiko遠程鏈接與數據傳輸;
- Jinja2用於編寫ansible的模板信息;web
YAML三板斧
縮進: YAML使用一個固定的縮進風格表示層級結構,每一個縮進由兩個空格組成, 不能使用tabs;
冒號: 以冒號結尾的除外,其餘全部冒號後面全部必須有空格;
短橫線: 表示列表項,使用一個短橫槓加一個空格。多個項使用一樣的縮進級別做爲同一列表;shell
YAML基本語法
列表:每個列表成員前面都要有一個短橫線和一個空格vim
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}
列表和字典能夠混合使用bash
- 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的掛載 測試實時同步