使用變量可以簡化操作,除此之外,ansible還提供了變量可以用來獲取被控主機上的信息
普通變量
變量名稱要求
變量名稱中不能有空格,也不能有下劃線(_
)以外的其他字符
如何引用變量
在tasks
中引用變量,需要使用{{}}
將變量括起來,注意在變量名稱前後都有空格
當變量名稱在行首出現時,還需要使用雙引號""
將整行括起來
在某些特殊情況下,也可不使用{{}}
,例如在when
條件中,或者在debug
模塊的var
選項中
vars:
user: joe
tasks:
- name: use variables
user:
name: "{{ user }}"
- name: use variables in debug
debug:
var: user
變量的作用範圍
當同一個變量名在不同級別都出現時,使用優先級最高的變量值
-
全局變量
一般在命令行中進行定義,對命令中的所有play
生效,優先級最高ansible -e "user=root" -e "passwd=123"
- play級別的變量
在play
中進行定義,只對指定的play
生效,優先級低於全局變量,高於主機級別的變量
---
- name: a play
vars:
- user: root
-
主機級別的變量
在inventory
文件或者指定的變量文件中定義,對相關的主機/主機組生效。優先級最低。-
在
inventory
文件中進行定義# 主機級別的變量 直接將變量寫在主機的後面 servera user=root # 主機組級別的變量,使用[group:vars]進行定義 [servers] servera serverb [servers:vars] user=root
- 在變量文件中進行定義
ansible會自動在當前目錄下尋找變量文件,主機變量文件在hostvars
目錄中,主機組變量文件在groups_vars
中。
在指定目錄中創建與inventory
中定義的主機/主機組同名的文件,文件中的變量會應用於對應的主機/主機組
-
變量矩陣
如果一個變量的值是一個列表,列表中的值還是一個列表,那麼就稱之爲變量矩陣,類似python
中的字典嵌套字典
定義方式
users:
bjones:
first_name: Bob
last_name: Jones
acook:
first_name: Anne
last_name: Cook
調用方式
可以使用類似於python
中字典的方式調用users['bjones']['first_name']
也可以用以下方式調用users.bjones.first_name
建議使用第一種方式,當變量名稱中包含關鍵字時,第二種方式可能會出現錯誤
幾種特殊的變量
register變量
可以在playbook
運行的過程中,將task
的運行結果賦予給某個變量,在後續的task
中進行輸出,或者根據結果執行不同的操作
# 示例,輸出MySQL從庫的同步狀態
- name: get slave status
mysql_replication:
login_user: root
login_password: "{{ mysql_root_password }}"
login_unix_socket: "{{ mysql_datadir }}/mysql.sock"
login_port: "{{ mysql_port }}"
mode: getslave
register: slave_status
- name: print slave status
debug:
msg: "Slave_IO: {{ slave_status.Slave_IO_Running }},Slave_SQL: {{ slave_status.Slave_SQL_Running }}"
facts變量
ansible
在執行playbook
時,默認會收集被控主機的信息,這些信息保存在facts
變量中,以便根據被控主機信息的不同來執行不同的操作。
關閉playbook中的變量收集
---
- hosts: all
gather_facts: no
使用adhoc收集facts變量
ansible all -m setup
facts變量內容
facts
變量是以json
格式保存的被控主機的信息,默認包括IP、主機名、磁盤、掛載、CPU、內存等信息
要查詢所有facts
變量內容,可以使用ansible node1 -m setup > setup.json
將變量保存到文件中進行查看
常用facts變量
- IPV4地址
ansible_default_ipv4['address']
- 主機名
ansible_hostname
- 內存
ansible_memtotal_mb
- 磁盤信息
ansible_devices
- 掛載信息
ansible_mounts
自定義facts變量
默認情況下,
setup
模塊會從被控節點主機上的/etc/ansible/facts.d
文件夾中獲取用戶定義變量。文件或者腳本以.fact
結尾
# 自定義fact文件
# cat custom.fact
[general]
package = httpd
service = httpd
state = started
enabled = true
# 調用自定義fact變量
# cat playbook.yml
---
- name: Install Apache and starts the service
hosts: webserver
tasks:
- name: Install the required package
yum:
name: "{{ ansible_facts['ansible_local']['custom']['general']['package'] }}"
state: latest
- name: Start the service
service:
name: "{{ ansible_facts['ansible_local']['custom']['general']['service'] }}"
state: "{{ ansible_facts['ansible_local']['custom']['general']['state'] }}"
enabled: "{{ ansible_facts['ansible_local']['custom']['general']['enabled'] }}"
magic變量
magic變量是本機的內容,包括inventory
文件中的內容
---
- hosts: localhost
tasks:
- name: print magic variables
debug:
var: hostvars['localhost']