天天看點

【Linux32-5】Ansible變量詳解1. 變量簡介2. 變量設定3. 主機清單變量4. 目錄中的變量5. 注冊變量6. 引用嵌套事實變量7. 魔術變量

文章目錄

  • 1. 變量簡介
    • 1.1 建立有效的變量名
    • 1.2 變量範圍
    • 1.3 變量的優先級
  • 2. 變量設定
    • 2.1 在playbook中直接設定
    • 2.2 在檔案中設定
    • 2.3 清單變量
    • 2.4 字典變量
  • 3. 主機清單變量
  • 4. 目錄中的變量
  • 5. 注冊變量
  • 6. 引用嵌套事實變量
  • 7. 魔術變量

變量詳解官方文檔

1. 變量簡介

1.1 建立有效的變量名

  • 隻能包含字母,數字和下劃線
  • 不能出現Python關鍵字或劇本關鍵字
  • 不能以數字開頭

1.2 變量範圍

Global 由配置,環境變量和指令行設定
Play 每次播放并包含結構,vars條目(vars; vars_files; vars_prompt),角色預設值和vars
Host 直接與主機相關聯的變量,例如 inventory清單,include_vars,facts 或已注冊的任務輸出
  • 優先級:Host>Play>Global

1.3 變量的優先級

通常,Ansible優先使用最近定義,更活躍且定義範圍更廣的變量。角色内預設檔案夾中的變量很容易被覆寫。角色的vars目錄中的所有内容都會覆寫名稱空間中該變量的先前版本。主機和/或庫存變量将覆寫角色預設值,但顯式包含(如vars目錄)或

include_vars

任務将覆寫inventory庫存變量
優先級從 低→高
1 指令行值不是變量:

-u my_user

2 role defaults(在role / defaults / main.yml中定義)
3 inventory file or script group vars
4 inventory group_vars/all
5 playbook group_vars/all
6 inventory group_vars/*
7 playbook group_vars/*
8 inventory file or script host vars
9 inventory host_vars/*
10 playbook host_vars/*
11 host facts / cached set_facts
12 play vars
13 play vars_prompt
14 play vars_files
15 role vars(在role / vars / main.yml中定義)
16 block變量(僅适用于block中的任務)
17 任務變量(僅适用于任務)
18 include_vars
19 set_facts /已注冊的變量
20 角色(和include_role)參數
21 包含參數
22

額外的變量

(例如

-e "user=my_user"

)(始終優先)
  1. 【在任何部分中,重新定義var都會覆寫前一個執行個體。如果多個子產品組具有相同的變量,則最後一個加載者獲勝。】
  2. 【在play的vars:部分中兩次定義變量,則第二個變量獲勝】

2. 變量設定

2.1 在playbook中直接設定

---
- hosts: test
  vars:
    http_port: 80	#通過修改變量值,控制tast組成員的Apache端口
  tasks:
           

2.2 在檔案中設定

變量檔案:
---
web_pkg: httpd
           
playbook檔案:
---
- host: test
  vars_files:
  - 變量檔案的路徑
  tasks:
  - name: 安裝 apache
    dnf:
      name: "{{ web_pkg }}"
      state: present
           

2.3 清單變量

定義清單變量

region:
  - northeast
  - southeast
也可以存儲在方括号中[],并用逗号分隔
           

引用清單變量

2.4 字典變量

定義字典變量

foo:
  field1: one
  field2: two
           

引用字典變量

兩種引用方式:
foo['field1']	#官方推薦
foo.field1
           

3. 主機清單變量

主機變量

[test]
server2	http_port=80 ansible_connection=ssh	ansible_user=myotheruser
           

主機組變量

[test]
server2
[test:vars]
http_port=80
           

組的組的組變量

[test]
server2
[prod]
server3
[webserver:children]
test
prod
[webserver:vars]
http_port=80
           

4. 目錄中的變量

  • group_vars目錄:清單變量(目錄中的檔案名稱與主機清單名稱一緻)
  • host_vars目錄:主機變量(目錄中的檔案名稱與主機名稱一緻)(取決于清單裡是主機名還是ip)
示例:
#主機清單hosts
[test]
server1

則在檔案group_vars/test中定義變量
           

5. 注冊變量

  • 使用task關鍵字從Ansible任務的輸出中建立變量

    register

    ,可以在劇本的任何後續任務中使用注冊的變量
  • 注冊變量是主機級變量。在具有循環的任務中注冊變量時,注冊的變量包含循環中每個項目的值。在循環期間放置在變量中的資料結構将包含一個

    results

    屬性,該屬性是子產品中所有響應的清單
---
- name: 測試Apache,傳回直
  uri:
    url: "http://172.25.17.2:{{http_port}}"
    return_content: yes
    status_code: 200
  register: result
- debug:
    msg: "{{ result['stdout'] }}"
           

6. 引用嵌套事實變量

許多注冊變量和事實變量是嵌套的YAML或JSON資料結構
Ansible事實是與遠端系統相關的資料,包括作業系統,IP位址,附加的檔案系統等

引用事實變量

{{ ansible_facts["網卡"]["ipv4"]["address"] }}
{{ ansible_facts.網卡.ipv4.address }}
           

檢視事實變量:

ansible <hostname> -m setup

緩存事實變量

與注冊變量一樣,事實預設情況下将事實存儲在記憶體中。但是,與注冊變量不同,事實可以獨立收集并緩存以供重複使用。使用緩存的事實,即使Ansible首先在第二個系統上執行目前播放,也可以在配置第二個系統時從一個系統引用事實

禁用事實變量

- hosts: whatever
  gather_facts: no	#禁用事實變量
           

7. 魔術變量

  • 魔術變量是Special Variables。魔術變量名稱是保留的,請勿使用這些名稱設定變量。該變量環境也被保留
  • 常用的魔術變量:
    • hostvars
    • groups
    • group_names
    • inventory_hostname
  • 使用hostvars,可以在劇本的任何位置通路為劇本中的任何主機定義的變量。也可以使用hostvars變量來通路Ansible事實
使用groups清單中所有組(和主機)的清單,枚舉組中的所有主機
{% for host in groups['組名'] %}
   # something that applies to all app servers.
{% endfor %}
           
使用groups和hostvars來查找組中的所有IP位址
{% for host in groups['組名'] %}
   {{ hostvars[主機]['ansible_facts']['網卡名']['ipv4']['address'] }}
{% endfor %}
           
其他魔術變量
ansible_play_hosts 是目前播放中仍處于活動狀态的所有主機的清單
ansible_play_batch 是主機名的清單,該主機名屬于該劇的目前“批處理”
serial 批處理大小(如果未設定,則等于整個運作)
ansible_playbook_python 是用于調用Ansible指令行工具的python可執行檔案的路徑
inventory_dir 是儲存Ansible的清單主機檔案的目錄的路徑名
inventory_file 是指向Ansible的清單主機檔案的路徑名和檔案名
playbook_dir 包含劇本的基本目錄
role_path 包含目前角色的路徑名,并且僅在角色内部起作用
ansible_check_mode 是一個布爾值,True如果使用來運作Ansible ,則設定為--check

示例:

繼續閱讀