Ansible_variable

Ansible變量

       系統自動化讓重復的工作變得更加容易,但是每個系統還是有一些細微的差別,變量就是如何處理系統之間的不同之處。這里將會列出變量的極大部分使用方法。

 

本文假設:你已經知道如何使用Ansible。知道inventory,facts等概念。

 

Ansible定義變量的幾中方式

1、在清單(inventory)中定義變量

2、在playbook中定義變量,使用var,或var_files:

3、在role中定義變量

4、自定義facts的變量

5、Register facts ,使用task返回結果作為變量

6、從命令行傳遞變量

使用變量,除了可用使用自定義的變量,還可以使用facts和其它主機的變量。

 

一、合法變量名

1、必須是字符,數字,下劃線組成,變量必須以字符開頭。

2、變量支持字典形式的映射。

3、有時候引用變量,使用小數點形式的引用方法可能會和Python內置的屬性和方法沖突。建議使用[]形式。

 

二、開始定義與使用變量

1、清單(inventory)變量

1.1定義清單主機變量.在對應的主機后面,提供key=value 形式語句,即可。格式如下

[webserver]
172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars"
172.16.1.20 ansible_ssh_user=root

1.2定義清單組變量,格式如下。

[webserver:vars]
inventory_group_var="Group_vars"

1.3 可以根據對應的inventory創建文件,寫入變量

mkdir /etc/ansible/host_vars     #Ansible會默認讀取此目錄下對應的主機名文件
mkdir /etc/ansible/group_vars    #同上
vim  /etc/ansible/host_vars/all 或者 vim  /etc/ansible/host_vars/hostname
vim /etc/ansible/group_vars/groupname

在文件中寫入變量即可。格式為ymal格式文件。


2、在playbook中定義變量

---
- hosts: hostname or groupname
  vars:                       #playbook中定義變量的關鍵字
   playbook_var: Playbook_vars
  var_files:                  #使用變量文件
   - filename.yml 
  tasks:
  - name: Copy Jinja2 file to remote host
    template: src=/home/aheahe/var_tu.j2 dest=/root/var.conf


3、在role中定義變量

mkdir roles/test/{vars,files,templates,tasks,defaults,handlers} -p  #創建role結構
vim roles/test/vars/main.yml     #1、編輯task文件
---
role_vars_var: Role_vars_var
vim roles/test/defaults/main.yml   #2、編輯默認變量文件
---
role_defaults_var: Role_default_var
vim roles/test/tasks/main.yml     #3、編輯roles var文件
--- 
- name: Learn role vars
  template: src=1.j2 dest=/root/1
vim roles/test/templates/1.j2    #4、編輯模板文件
{{ role_vars_var }}
{{ role_defaults_var }}
vim site.yml                   #5、編輯執行文件
---
- hosts: 172.16.1.10
  roles:
  - /home/aheahe/roles/test
ansible-playbook site.yml   #6、執行
[172.16.1.10~]# cat 1    #7、在被管理節點上查看結果
 
Role_vars_var
Role_default_var

Tip:在引用role的時候,還可以傳遞變量給role

- hosts: webservers
  roles:
   - common
   - {  role: test, role_defaults_var: 'var_value'  }


4、自定義Facts變量。

如果在被管理的主機上存在/etc/ansible/facts.d 目錄,其中的以.fact 為文件結尾的JSON格式或者YML格式文件都會當做自定義facts。

[172.16.1.10]# vim /etc/ansible/facts.d/local.fact  #編輯自定義facts文件
[general]
Aheahe=aihe
local="Local facts"
[ansible ~]$ansible 172.16.1.10 -m setup -a 'filter=ansible_local'  #在ansible控制節點查看自定義facts變量是否生效
172.16.1.10 | success >> {
    "ansible_facts": {
        "ansible_local": {
            "local": {
                "general": {
                    "aheahe": "aihe",
                    "local": "\"Local facts\""
                }
            }
        }
    },
    "changed": false
}

 

可以像fact一樣使用,自定義的fact變量。

vim roles/test/templates/1.j2   #使用剛才的角色
{{ role_vars_var }}
{{ role_defaults_var }}
{{ ansible_local.local.general.local }}
ansible-playbook site.yml   #執行剛才的site.yml
[172.16.1.10 -]# cat /root/1    #被管理節點查看結果,顯示正確
Role_vars_var
Role_default_var
"Local facts"

4.1這里還可以在控制節點上面傳遞自定義變量到被管理節點,編輯如下ymal格式文件。

- hosts: webservers
  tasks:
    - name: create directory for ansible custom facts
      file: state=directory recurse=yes path=/etc/ansible/facts.d
    - name: install custom impi fact
      copy: src=ipmi.fact dest=/etc/ansible/facts.d
    - name: re-readfacts after adding custom fact
      setup: filter=ansible_local

5、定義Register變量,

Register變量是將task的結果信息當做變量使用。在任務的執行結果后面加上register 關鍵字即可定義變量

vim study.yml 
---
- hosts: 172.16.1.10
  vars:
   playbook_var: Playbook_vars
  tasks:
  - name: Learn Register
    shell: ifconfig
    register: command_result
 
  - name: Test register
    shell: date
    when: command_result.rc == 0
ansible-playbook study.yml -v   #執行的時候加上-v 選項。查看輸出信息


6、從命令行傳遞變量.

相信這點對大家來說已經不成問題了,便不再細說

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"  #傳遞key=value形式變量
--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'  #傳遞JSON格式變量
--extra-vars "@some_file.json"    #傳遞JSON格式文件變量

三、使用變量

上面在舉例子的時候,已經說明如何使用了。下面介紹如何使用fact變量和一臺主機使用另外一臺主機的變量。

使用實現定義好的變量,在變量兩邊加上大括號,格式為{{ var_name }}

vim var.j2
{{ ansible_hostname  }}   #這里是使用fact變量,兩個主機的結果不一樣
{{ hostvars['172.16.1.10']['ansible_hostname'] }}  #這里兩臺主機的結果一樣,node2>使用node1的變量
vim test.yml   #提供劇本
---
- hosts: webserver
  tasks:
  - name: Use fact and other host vars
    template: src=/home/aheahe/playbook/var.j2 dest=/root/var.conf
ansible-playbook test.yml  #執行
[root@node1]# cat /root/var.conf     #這里可以看到node2使用node1的變量。
node1   #這里是使用fact變量,兩個主機的結果不一樣
node1  #這里兩臺主機的結果一樣,node2使用node1的變量

四、變量的優先級。處理同一個變量名多處定義的問題。

3.1、在1.x版本里面,越靠下優先級越高,可以覆蓋上面的

1、role defaults 中定義的變量,優先級最低

2、從被管理系統中收集的facts信息

3、inventory中定義的變量

4、在playbook中的vars: 或者 roles 中的vars

5、一些連接變量,例如ansible_user 。

6、命令行的變量  ansible-playbook -e 選項的變量, 優先級別最高。

3.2 ,在2.x系列的版本中調整變量優先級的順序為如下。優先級由低到高

  1. role defaults 

  2. inventory vars 

  3. inventory group_vars

  4. inventory host_vars

  5. playbook group_vars

  6. playbook host_vars

  7. host facts

  8. registered vars

  9. set_facts

  10. play vars

  11. play vars_prompt

  12. play vars_files

  13. role and include vars

  14. block vars (only for tasks in block)

  15. task vars (only for the task)

  16. extra vars


參考:

http://docs.ansible.com/ansible/playbooks_variables.html

原創文章,作者:艾賀,如若轉載,請注明出處:http://www.www58058.com/9431

(0)
艾賀艾賀
上一篇 2015-11-26 16:41
下一篇 2015-11-26 17:26

相關推薦

  • Linux里的用戶與組

    任何事務的進行都離不開管理,脫離了管理的系統將會是一團亂麻。今天就來講講Linux里的用戶與組的管理 首先,用戶與組不會憑空出現,必須得是系統本身或人為創建的 。     所以,系統創建的就叫系統用戶.系統組,用戶創建的就是普通用戶.普通組。 useradd  創建用戶 -u 創建用戶并指定用戶的UID -g…

    2017-07-30
  • 用“逐步排除”的方法定位Java服務線上“系統性”故障

    一、摘要 由 于硬件問題、系統資源緊缺或者程序本身的BUG,Java服務在線上不可避免地會出現一些“系統性”故障,比如:服務性能明顯下降、部分(或所有)接口超 時或卡死等。其中部分故障隱藏頗深,對運維和開發造成長期困擾。筆者根據自己的學習和實踐,總結出一套行之有效的“逐步排除”的方法,來快速定位Java 服務線上“系統性”故障。 二、導言 Java 語言是廣…

    2015-02-28
  • Linux各文件顏色

    Linux系統中默認將不同的文件類型以不同的顏色加以區分: 1、普通文件   白色 2、目錄文件  藍色 3、鏈接文件  青色 4、套接字文件  粉紅色 5、可執行文件  綠色 6、管道文件  7、塊文件   黃色 8、壓縮文件  紅色 默認文件顯示顏色可以在…

    Linux干貨 2016-10-19
  • 計算機的組成及其功能

    計算機由運算器,控制器、存儲器及輸入、輸出裝置五部分組成。 第一,運算器(Arithmetical and Logical Unit),也稱作算術邏輯單元,主要是對數據進行各種運算。 第二,控制器(Control Unit)是計算機的控制中心,協調各計算機各部分按照預先的目標和步驟有序的工作??刂破鲝拇鎯ζ髦兄饤l取出指令,分析每條指令規定的操作和所需數據的存…

    Linux干貨 2016-09-17
  • linux文件基本權限、默認權限、隱藏權限和ACL權限

    基本權限    文件屬性rwx     每個文件當用ls -l查看時,都會顯示文件的詳細屬性信息,其中在排在首位的共有10位字符信息     例如 -rw-r–rw-. 1 root root …….. 共有10位,第一位代表的是文件的類型,后邊9位表示的是文件的…

    Linux干貨 2016-08-04
  • Linux學習總結02—Linux的操作系統發展史(原創)

       我們都知道,在美國賓夕法尼亞大學,有那么一種計算機,叫ENIAC,這種機器耗電量是非常大,而且主機也是龐大,它誕生于1946年的2月14日的情人節,確實有紀念意義,就算是約炮也是拿著智能手機先搖一搖,好看就勾搭,不好看的就拉黑,這臺計算機可并不是造福人類的,只是計算數據,我想,當時的情況是這樣,在這臺計算機沒有出世之前,那幫工程師們…

    Linux干貨 2016-10-29
欧美性久久久久