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
目錄結構