天天看點

Ansible 變量

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            
上一篇: ansible學習
下一篇: ansible 介紹

繼續閱讀