自動化運維-ansible中的變量運用
一、變量命名規則
- 組成:字母、數字、下劃線。
- 必須以字母開頭。
- 合法:
app_port
,web_1
,varA
- 非法:
2_var
(以數字開頭),my-var
(包含其他字符),_private
(以下劃線開頭)
- 合法:
- 避免使用內置關鍵字:例如
hosts
,tasks
,name
,vars
,when
,register
等。
二、變量的優先級
- Global范圍(高):從命令行和ansible配置設置的變量
- play范圍(中):set_fact、register和在play和相關結構中設置的變量
- Host范圍(低):inventory、facts的變量,在主機組和個別主機上設置的變量
命令行 > Playbook 中的設置 > Inventory 中的設置 > 角色默認值
越“具體”的設置,優先級越高
三、注冊和定義變量的各種方式
vars
定義變量Vars_files
定義變量register
注冊變量set_fact
定義變量- 通過命令傳入變量
- 主機清單中的變量
- 內置變量
With_itens
疊加變量
四、對各種方式的示例
-
vars
定義變量[student@master ansible] vim a.yml # 編輯內容如下 --- - name: test1hosts: node1vars:- a: 1- b: 2- c:c1: 3c2: 4tasks:- name: test11debug:msg: this is {{ a }}- name: test12debug:msg: "{{ b }}"- name: test13debug:msg: "{{ c.c1 }}"- name: test14debug:var: c.c2
-
Vars_files
定義變量[student@master ansible] vim yyy # 編輯內容如下 a: 1 b: 2 c: c1: 3c2: 4
[student@master ansible] vim b.yml # 編輯內容如下 --- - name: test2hosts: node1vars_files: /home/student/ansible/yyytasks:- name: test21debug:msg: this is {{ a }}- name: test22debug:msg: "{{ b }}"- name: test23debug:msg: "{{ c.c1 }}"- name: test24debug:var: c.c2
-
register
注冊變量使?register選項,可以將當前task的輸出結果賦值給?個變量
以下示例:
/tmp/file1
的內容為 123321 ,/tmp/file11
不存在[student@master ansible] vim c.yml # 編輯內容如下 --- - name: test3hosts: node1tasks:- name: test31shell:cmd: cat /tmp/file1register: yy- name: test32debug:var: yy.stdout- name: test33shell:cmd: cat /tmp/file11register: yyyyignore_errors: yes- name: test34debug:var: yyyy.stdout
如圖所示:無論輸出結果是否正確,都會賦值給自定義的變量
-
set_fact
定義變量可以將某個變量的值賦值給另?個變量,也可以將字符串賦值給變量
事實變量是 Ansible 自動發現并設置的關于受控主機的系統信息和屬性的變量
每個主機都有自己獨有的一套事實變量,是Ansible預定義的,有固定的命名格式(通常以
ansible_
為前綴),你不能隨意改變這些變量的名字[student@master ansible] ansible node1 -m setup > z
使用
ansible 主機名 -m setup
可以查看主機的所有事實變量為了方便查找,一般會重定向到自定義的文件中
常用變量名 對應的含義 ansible_default_ipv4.address
ipv4地址 ansible_enp1s0.ipv4.address
ansible_網卡名稱.ipv4.address ansible_fqdn
完全合格域名(FQDN) ansible_hostname
主機名稱 ansible_memtotal_mb
內存大小 ansible_bios_version
bios版本 ansible_devices.vda.size
vda硬盤大小 ansible_devices.vdb.size
vdb硬盤大小 ansible_lvm.vgs
邏輯卷中卷組 [student@master ansible] vim d.yml # 編輯內容如下 --- - name: test4hosts: node1tasks:- name: test41debug:msg: the ipv4 address of {{ ansible_hostname }} is {{ ansible_default_ipv4.address }}
-
通過命令傳入變量
[student@master ansible] vim e.yml # 編輯內容如下 --- - name: test5hosts: node1tasks:- name: test51debug:msg: this is {{ aa }}- name: test52debug:var: bb
-
主機清單中的變量
在主機清單中定義變量
[student@master ansible] vim inventory # 編輯內容如下 node5[testa] node1 node2[testa:vars] var1='ni' var2='hao'[testb] node3 node4
[student@master ansible] vim f.yml # 編輯內容如下 --- - name: test6hosts: node1tasks:- name: test61debug:msg: "{{ var1 }}"- name: test62debug:msg: var2
除了可以在主機清單里定義變量外,還可以在 /etc/ansible(root用戶)或 /home/用戶名/ansible(普通用戶) 目錄下創建group_vars和host_vars目錄下定義變量
node1文件名以主機命名,還可以命名為node1.yml
[student@master ansible] mkdir host_vars [student@master host_vars] vim node1 [student@master host_vars] vim node1.yml
# 在 node1 中編輯內容如下 var1: t1 var2: t2# 在 node1.yml 中編輯內容如下 var1: t3 var2: t4
編輯 playbook ,看輸出變量的值
[student@master ansible] vim g.yml # 編輯內容如下 --- - name: test7hosts: node1tasks:- name: test71debug:msg: "{{ var1 }}"- name: test72debug:var: var2
發現輸出結果為 node1 中定義的值
如果node1與node1.yml同時存在,則 node1的優先級更高
除了在 host_vars 目錄下,在 group_vars 目錄下也同理
如果 host_vars 目錄和 group_vars 目錄同時存在,則 host_vars 的優先級更高
-
內置變量
是 Ansible 自動預定義和設置的變量。你無需使用
set_fact
或vars
來聲明它們為你提供關于當前運行環境、Inventory(清單)、Playbook 本身以及連接信息等重要上下文
常用變量名 對應作用 ansible_version
顯示ansible的版本 inventory_hostname
顯示主機清單主機名稱 play_hosts
顯示當前playbook實際要操作的所有主機的列表 groups
顯示主機清單中的組與主機的對應關系 groups.all
顯示所有清單主機 group_names
顯示主機的主機組的名稱 inventory_dir
顯示主機清單所在的目錄 -
With_itens
疊加變量可以給一個變量賦予多個值
讓一個任務對列表中的每個項目執行一次
[student@master ansible] vim h.yml # 編輯內容如下 --- - name: test8hosts: node1tasks:- name: test81shell:cmd: echo "{{ item }}"with_items:- user1- user2- user3register: xx- name: test82debug:var: xx.results[0].stdout- name: test83debug:var: xx.results[1].stdout- name: test84debug:var: xx.results[2].stdout