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服務器上有4個用戶,分別是root、www、ftp和mysql,在同一時間內root用戶可能在管理維護系統,www用戶可能在修改自己的程序和操作…

    Linux干貨 2016-08-04
  • 推薦-DNS架設實驗

    DNS架設實驗 實驗拓撲 實驗準備 流程 測試 總結 實驗拓撲: 1.對于來自內網的DNS正反向解析,并實現view選擇指定解析庫解析。2.對于來自外網的DNS正向解析,并實現view選擇指定解析庫解析。3.實現主從服務器結構。4.實現一個完成對一個子域的授權。5.子域中的所有查詢xiao.com.的信息都轉向192.168.1.1解析。 1.根據view,…

    2016-04-19
  • btrfs文件系統——更加高級的文件系統

    Btrfs 文件系統: Btrfs ( B-tree ,Butter FS ,Better FS ) GPL ,Oracle公司在2007年研發,支持CoW(對文件快照),為了取代ext3,ext4,xfs 核心特點:          多物理卷支持:btrfs可由多個底層物理卷…

    Linux干貨 2016-08-31
  • httpd 安裝配置

    web 服務介紹 web服務時一種應用程序的服務,它所提供的最主要的信息是一種超文本標記語言(HTML)、多媒體資源(如:視頻、圖片、音樂等)。HTML是一種純文字的文本信息,通過所謂的標簽來規范所要顯示的內容格式,在客戶端通過瀏覽器的形式對HTML及多媒體資源進行解析,然后呈現在終端上。主要由http和https協議實現 http協議 HTTP是一個屬于應…

    Linux干貨 2016-11-01
  • 馬哥教育網絡班22期+第15周課程練習

    1、總結sed和awk的詳細用法; sed [OPTION]…  'script'  [input-file] … script: 地址定界編輯命令 常用選項: -n:不輸出模式空間中的內容至屏幕; -e script, –expression=sc…

    Linux干貨 2016-12-14
  • awk

    文本處理工具 文本處理三工具:grep,sed,awk grep,egrep,fgrep:文本過濾工具 sed:行編輯器 awk:報告生成器,格式化文本輸出; awk gawk – pattern scanning and processing language lrwxrwxrwx. 1 root root 4 May 17 19:23 /bi…

    Linux干貨 2017-05-21
欧美性久久久久