第一百一十天 : ansible-playbook 使用詳解
PlayBook:
核心元素:
Tasks:任務,由模組定義的操作的列表;
Variables:變數
Templates:模板,即使用了模板語法的文字檔案;
Handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎元件:
Hosts:執行指定任務的目標主機;
remote_user:在遠端主機以哪個使用者身份執行;
sudo_user:非管理員需要擁有sudo許可權;
tasks:任務列表
模組,模組引數:
格式:
(1) action: module arguments
(2) module: arguments
核心元素:
Tasks:任務,由模組定義的操作的列表;
Variables:變數
Templates:模板,即使用了模板語法的文字檔案;
Handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎元件:
Hosts:執行指定任務的目標主機;
remote_user:在遠端主機以哪個使用者身份執行;
sudo_user:非管理員需要擁有sudo許可權;
tasks:任務列表
模組,模組引數:
格式:
(1) action: module arguments
(2) module: arguments
示例1:
- hosts: all
remote_user: root
tasks:
- name: install a group
group: name=mygrp system=true
- name: install a user
user: name=user1 group=mygrp system=true
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd
- name: start httpd service
service: name=httpd state=started
執行playbook,使用ansible-playbook命令
(1) 檢測語法
ansible-playbook –syntax-check /path/to/playbook.yaml
(2) 測試執行
ansible-playbook -C /path/to/playbook.yaml
–list-hosts
–list-tasks
–list-tags
(3) 執行
ansible-playbook /path/to/playbook.yaml
-t TAGS, –tags=TAGS
–skip-tags=SKIP_TAGS
–start-at-task=START_AT
handlers:由特定條件觸發的Tasks;
呼叫及定義方式:
tasks:
- name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
- name: HANDLER_NAME
module: arguments
示例:
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd service
- name: start httpd service
service: name=httpd state=started
handlers:
- name: restart httpd service
service: name=httpd state=restarted
tags:給指定的任務定義一個呼叫標識;
- name: NAME
module: arguments
tags: TAG_ID
Variables:
型別:
內建:
(1) facts
自定義:
(1) 命令列傳遞;
-e VAR=VALUE
(2) 在hosts Inventory中為每個主機定義專用變數值;
(a) 向不同的主機傳遞不同的變數 ;
IP/HOSTNAME variable_name=value
(b) 向組內的所有主機傳遞相同的變數 ;
[groupname:vars]
variable_name=value
(3) 在playbook中定義
vars:
– var_name: value
– var_name: value
(4) Inventory還可以使用引數:
用於定義ansible遠端連線目標主機時使用的屬性,而非傳遞給playbook的變數;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
(5) 在角色呼叫時傳遞
roles:
– { role: ROLE_NAME, var: value, …}
變數呼叫:
{{ var_name }}
Templates:模板
文字檔案,內部巢狀有模板語言指令碼(使用模板語言編寫)
Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.
語法:
字面量:
字串:使用單引號或雙引號;
數字:整數、浮點數;
列表:[item1, item2, …]
元組:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布林型:true/false
算術運算:
+, -, , /, //, %, *
比較操作:
==, !=, >, <, >=, <=
邏輯運算:and, or, not
執行模板檔案中的指令碼,並生成結果資料流,需要使用template模組;
template:
-a ”“
src=
dest=
mode=
onwer=
group=
注意:此模板不能在命令列使用,而只能用於playbook;
示例:
- hosts: ngxsrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: install conf file
template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: ngxconf
notify: reload nginx service
- name: start nginx service
service: name=nginx state=started enabled=true
handlers:
- name: reload nginx service
shell: /usr/sbin/nginx -s reload
條件測試:
when語句:在tasks中使用,Jinja2的語法格式;
- hosts: all
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: start nginx service on CentOS6
shell: service nginx start
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
- name: start nginx service
shell: systemctl start nginx.service
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
迴圈:迭代,需要重複執行的任務;
對迭代項的引用,固定變數名為”item”,使用with_item屬性給定要迭代的元素;
元素:列表
字串
字典
基於字串列表給出元素示例:
- hosts: websrvs
remote_user: root
tasks:
- name: install packages
yum: name={{ item }} state=latest
with_items:
- httpd
- php
- php-mysql
- php-mbstring
- php-gd
基於字典列表給元素示例:
- hosts: all
remote_user: root
tasks:
- name: create groups
group: name={{ item }} state=present
with_items:
- groupx1
- groupx2
- groupx3
- name: create users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- {name: 'userx1', group: 'groupx1'}
- {name: 'userx2', group: 'groupx2'}
- {name: 'userx3', group: 'groupx3'}
角色:roles
以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等;
role_name/
files/:儲存由copy或script等模組呼叫的檔案;
tasks/:此目錄中至少應該有一個名為main.yml的檔案,用於定義各task;其它的檔案需要由main.yml進行“包含”呼叫;
handlers/:此目錄中至少應該有一個名為main.yml的檔案,用於定義各handler;其它的檔案需要由main.yml進行“包含”呼叫;
vars/:此目錄中至少應該有一個名為main.yml的檔案,用於定義各variable;其它的檔案需要由main.yml進行“包含”呼叫;
templates/:儲存由template模組呼叫的模板文字;
meta/:此目錄中至少應該有一個名為main.yml的檔案,定義當前角色的特殊設定及其依賴關係;其它的檔案需要由main.yml進行“包含”呼叫;
default/:此目錄中至少應該有一個名為main.yml的檔案,用於設定預設變數;
在playbook中呼叫角色的方法:
- hosts: HOSTS
remote_user: USERNAME
roles:
- ROLE1
- ROLE2
- { role: ROLE3, VARIABLE: VALUE, ...}
- { role: ROLE4, when: CONDITION }
部落格作業:以上所有內容;
實戰作業:
(1) 主/備模型的keepalived+nginx;
(2) httpd+php+php-mysql;
(3) mysql-server或mariadb-server;
擁有testdb庫,並允許testuser對其擁有所有許可權;