Ansible 和其他編輯語言一樣,可以通過變量來存儲值,并在 Ansible 項目的所有檔案中使用這些值
變量的命名規則:
- 必須以字母開頭;
- 隻能包含字母,數字和下劃線;
變量範圍:
Global:全局變量,在指令行中,通過 -e 參數傳遞;
Play:在 Playbook 中的 play 裡面 通過 vars 或 vars_files 關鍵字定義的變量
Host:由清單中,主機或主機組中定義的變量
全局變量
編寫 playbook,在該 playbook 中,我們為 apt 子產品來安裝軟體包,并為軟體包的 name 選項指定一個名為 package 的變量;
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Install Apache
hosts: servera
tasks:
- name: Install {{ package }}
apt:
name: "{{ package }}"
state: present
* 在 play 中通過 “{{ VariableName }}”
* 在需要列印出來的字段中引用變量不需要加引号,在其他地方引用變量需要加引号,如,在 name 中引用,因為變量名與花括号之間有空格,name 不能把他們識别成一個整體,是以不加引号會報錯;
運作 playbook 時,通過 -e 來指定變量名對應的值;
it@workstation:~/ansible$ ansible-playbook test.yml -e "package=apache2"
BECOME password:
PLAY [Install Apache] ******************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Install apache2] *****************************************************************************
ok: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
* 我前面已經執行過安裝 Apache2 了,是以這裡執行的結果是 ok,而不是 changed;
Play 變量
Play 變量就是在 playbook 中為每個 play 定義的變量,play 變量可以直接定義在 play 中,通過 vars 關鍵字定義;也可以定義在檔案中,然後在 play 中通過 vars_files 關鍵字導入變量檔案;
通過 vars 關鍵字定義變量
建立 playbook,并通過 vars 關鍵定義一個 user 的變量,對應的值為 Jack
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: servera
vars:
user: jack
tasks:
- name: Create a user named {{ user }}
user:
name: "{{ user }}"
運作 playbook
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Create a user named jack] ********************************************************************
changed: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
從建立使用者的 task 名稱可以看到,變量 user 被其對應的值所替換;
通過檔案定義變量
建立變量檔案,并在檔案中定義一個 user 變量,并指定值為 Jerry
it@workstation:~/ansible$ vim user.yml
it@workstation:~/ansible$ cat user.yml
---
user: jerry
* 注意變量檔案的格式應為 yml 檔案格式;
編寫 playbook,在 play 中通過 vars_files 關鍵字來導入變量檔案
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: servera
vars_files:
- user.yml
tasks:
- name: Create a user named {{ user }}
user:
name: "{{ user }}"
主機變量
編輯主機清單,在主機後面添加一個 user 變量,并指定值為 user1;
it@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb user=user1
[web]
servera
[prod:children]
web
建立 playbook
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: serverb
tasks:
- name: Create a user named {{ user }}
user:
name: "{{ user }}"
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [serverb]
TASK [Create a user named user1] *******************************************************************
changed: [serverb]
PLAY RECAP *****************************************************************************************
serverb : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
變量 user 被對應的值,user1 替換了;
我們還可以在主機變量目錄(host_vars)中定義主機變量檔案
更改清單,删除清單中定義的變量
it@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb
[web]
servera
[prod:children]
web
在 ansible 目錄中建立一個 host_vars 目錄,并在這個目錄下以主機名建立一個 yml 檔案,并在檔案中指定 user 變量;
it@workstation:~/ansible$ mkdir host_vars
it@workstation:~/ansible$ vim host_vars/servera.yml
it@workstation:~/ansible$ cat host_vars/servera.yml
---
user: user2
編輯 playbook
t@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: servera
tasks:
- name: Create a user named {{ user }}
user:
name: "{{ user }}"
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
TASK [Create a user named user2] *******************************************************************
changed: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
變量 user 被對應的值,user2 替換了;
主機組變量
編輯主機清單檔案,通過 [GroupName:vars] 為主機組添加變量
it@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb
[web]
servera
serverb
[prod:children]
web
[web:vars]
user=user3
删除之前在 host_vars 目錄下建立的變量檔案
it@workstation:~/ansible$ rm host_vars/servera.yml
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: web
tasks:
- name: Create a user named {{ user }}
user:
name: "{{ user }}"
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
ok: [serverb]
TASK [Create a user named user3] *******************************************************************
changed: [servera]
ok: [serverb]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
變量 user 被對應的值,user3 替換了;
同樣,你也可以通過組變量檔案目錄(group_vars)定義主機組變量檔案
更改主機清單,删除前面建立的主機變量
t@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb
[web]
servera
serverb
[prod:children]
web
建立主機組變量目錄,并以組名作為檔案名,建立一個 yml 格式的變量檔案,并在檔案中指定 user 變量,值為 user4;
it@workstation:~/ansible$ mkdir group_vars
it@workstation:~/ansible$ vim group_vars/web.yml
it@workstation:~/ansible$ cat group_vars/web.yml
---
user: user4
it@workstation:~/ansible$ vim test.yml
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
hosts: web
tasks:
- name: Create a user named {{ user }}
user:
name: "{{ user }}"
it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password:
PLAY [Create User] *********************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [servera]
ok: [serverb]
TASK [Create a user named user4] *******************************************************************
changed: [serverb]
changed: [servera]
PLAY RECAP *****************************************************************************************
servera : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0