1、Playbook 變量
ansible中使用變量,能夠讓我們的工作變得更加靈活
定義變量
變量名應該由字母、數字、下划線組成,變量名需要字母開頭,ansible內置的關鍵字不能作為變量名使用
2、Playbook 變量定義
使用vars關鍵字可以在當前playbook中進行變量定義,讓我們要使用變量的時候,則需要引用對應變量名,使用{{ 變量名 }}可以引用對應變量。
變量簡單定義
- hosts: all
vars: #定義變量
file_name: jsn_yaml_vars #變量名(隨意):file_name,變量的內容:jsn_yaml_vars
tasks: #{{ file_name }}引用上面定義的變量
- name: 應用變量名:file_name
file: path=/tmp/{{ file_name }} state=touch
定義多個變量
- hosts: all
vars:
t1: v1
t2: v2
除了上述語法,也可用YAML快序列語法定義變量
- hosts: all
vars:
- t1: v1
- t2: v2
定義變量時,還可以類似以"屬性"的方式定義變量
- hosts: 10.4.7.7
vars:
nginx:
proxy_1: /etc/nginx/conf.d/nginx_1.proxy
proxy_2: /etc/nginx/conf.d/nginx_2.proxy
tasks:
- name: task1
file:
path: "{{ nginx.proxy_1 }}"
state: touch
- name: task1
file:
path: "{{ nginx['proxy_2'] }}" # 第二種引用變量.屬性的方法
state: touch
Node:注意我們在使用變量使用了雙引號,而在最開頭的例子中並沒有在引用變量的時候使用雙引號,那是因為第一個實例中變量在被引用的時候,並沒有處於開頭的位置path=/tmp/{{ file_name }}
,所以在不需要雙引號,但是path: "{{ nginx.proxy_1 }}"
處於開頭位置的變量,就需要雙引號
定義變量寫入到指定文件中,然后在playbook中引用
1.創建nginx_vars.yaml文件,定義變量
nginx:
proxy_1: /etc/nginx/conf.d/nginx_1.proxy
proxy_2: /etc/nginx/conf.d/nginx_2.proxy
2.在nginx_vars.yaml文件中定義完變量后,即可在playbook中引入包含變量的文件
- hosts: 10.4.7.7
vars_files:
- ~/nginx_vars.yaml
tasks:
- name: task1
file:
path: "{{ nginx.proxy_1 }}"
state: touch
- name: task1
file:
path: "{{ nginx['proxy_2'] }}"
state: touch
該例中使用vars_files
關鍵字引入對應的變量文件,然后使用文件中的變量,該關鍵字可以引入一個變量文件,也可以引入多個變量文件,每個被引入的文件都需要以-
開頭,vars
和vars_files
可以同時使用
playbook引用變量,執行的時候指定賦值變量
1.創建yaml
- hosts: all
tasks:
- name: Create New File
file: path=/tmp/{{ file_name }} state=touch
2.playbook執行的時候參數--extra-vars
指定賦值給變量
$ ansible-playbook f1.yaml --extra-vars "file_name=jsn_extra-vars"
3、Playbook 變量注冊
register關鍵字可以存儲指定命令的輸出結果到一個自定義的變量中,它還有一個非常棒的用法,就是我們需要判斷對執行了某個操作或某個命令后,如何做出相應的響應處理(執行其它的ansible語句),也會用到它。
register簡單實用
1.f1.yaml
文件內容如下
- hosts: 10.4.7.7
tasks:
- name: register vars
shell: hostname
register: System_Status
- name: display vars
debug: msg={{ System_Status.stdout }}
2.執行playbook
[root@m01 ~]# ansible-playbook f1.yaml
PLAY [10.4.7.7] ****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [10.4.7.7]
TASK [register vars] ***********************************************************
changed: [10.4.7.7]
TASK [display vars] ************************************************************
ok: [10.4.7.7] => {
"msg": "web01"
}
PLAY RECAP *********************************************************************
10.4.7.7 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 第一個shell執行完后,使用register獲取數據到
System_Status
里 System_Status
是一個key/value字典- debug輸出
System_Status.stdout的
具體內容
register生產示例
我需要判斷sda1是否存在,如果存在則執行文件拷貝
- hosts: 10.4.7.7
tasks:
- name: Create a register to represent the status if the /dev/sda1 exsited
shell: df -h | grep sda1
register: dev_sda1_result
ignore_errors: True
- name: Copy test.sh to all hosts
copy: src=/root/test.sh dest=/tmp/test.sh mode=755
when: dev_sda1_result.rc == 0
當df -h | grep sda1
執行后,會在dev_sda1_result
里寫入執行結果,然后dev_sda1_result.rc
里的rc就是命令的返回狀態,非0表示執行失敗,ignore_errors
關鍵字一定要設置為True,否則如果命令執行不成功,即echo $?
不為0,則在語句后面的ansible語句不會被執行,導致程序中止。
register多條件判斷
然后在when
中用and
或者or
來組合判斷。比如當兩種條件之一成功:
- name: Copy test.sh to all hosts
copy: src=/root/test.sh dest=/tmp/test.sh mode=755
when: ( dev_sda1_result.rc == 0 ) or ( dev_sda2_result.rc == 0 )