使用變量可以簡(jiǎn)化操作焰轻,除此之外巩掺,ansible還提供了變量可以用來獲取被控主機(jī)上的信息
普通變量
變量名稱要求
變量名稱中不能有空格,也不能有下劃線(_
)以外的其他字符
如何引用變量
在tasks
中引用變量利耍,需要使用{{}}
將變量括起來,注意在變量名稱前后都有空格
當(dāng)變量名稱在行首出現(xiàn)時(shí)玉转,還需要使用雙引號(hào)""
將整行括起來
在某些特殊情況下爪模,也可不使用{{}}
,例如在when
條件中刀诬,或者在debug
模塊的var
選項(xiàng)中
vars:
user: joe
tasks:
- name: use variables
user:
name: "{{ user }}"
- name: use variables in debug
debug:
var: user
變量的作用范圍
當(dāng)同一個(gè)變量名在不同級(jí)別都出現(xiàn)時(shí)咽扇,使用優(yōu)先級(jí)最高的變量值
- 全局變量
一般在命令行中進(jìn)行定義邪财,對(duì)命令中的所有play
生效,優(yōu)先級(jí)最高
ansible -e "user=root" -e "passwd=123"
- play級(jí)別的變量
在play
中進(jìn)行定義树埠,只對(duì)指定的play
生效,優(yōu)先級(jí)低于全局變量嘶伟,高于主機(jī)級(jí)別的變量
---
- name: a play
vars:
- user: root
- 主機(jī)級(jí)別的變量
在inventory
文件或者指定的變量文件中定義怎憋,對(duì)相關(guān)的主機(jī)/主機(jī)組生效九昧。優(yōu)先級(jí)最低铸鹰。- 在
inventory
文件中進(jìn)行定義
- 在
# 主機(jī)級(jí)別的變量 直接將變量寫在主機(jī)的后面
servera user=root
# 主機(jī)組級(jí)別的變量蹋笼,使用[group:vars]進(jìn)行定義
[servers]
servera
serverb
[servers:vars]
user=root
- 在變量文件中進(jìn)行定義
ansible會(huì)自動(dòng)在當(dāng)前目錄下尋找變量文件圾笨,主機(jī)變量文件在hostvars
目錄中速兔,主機(jī)組變量文件在groups_vars
中墅拭。
在指定目錄中創(chuàng)建與inventory
中定義的主機(jī)/主機(jī)組同名的文件,文件中的變量會(huì)應(yīng)用于對(duì)應(yīng)的主機(jī)/主機(jī)組
變量矩陣
如果一個(gè)變量的值是一個(gè)列表涣狗,列表中的值還是一個(gè)列表谍婉,那么就稱之為變量矩陣,類似python
中的字典嵌套字典
定義方式
users:
bjones:
first_name: Bob
last_name: Jones
acook:
first_name: Anne
last_name: Cook
調(diào)用方式
可以使用類似于python
中字典的方式調(diào)用
users['bjones']['first_name']
也可以用以下方式調(diào)用
users.bjones.first_name
建議使用第一種方式镀钓,當(dāng)變量名稱中包含關(guān)鍵字時(shí)穗熬,第二種方式可能會(huì)出現(xiàn)錯(cuò)誤
幾種特殊的變量
register變量
可以在playbook
運(yùn)行的過程中,將task
的運(yùn)行結(jié)果賦予給某個(gè)變量丁溅,在后續(xù)的task
中進(jìn)行輸出唤蔗,或者根據(jù)結(jié)果執(zhí)行不同的操作
# 示例,輸出MySQL從庫的同步狀態(tài)
- 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
在執(zhí)行playbook
時(shí)窟赏,默認(rèn)會(huì)收集被控主機(jī)的信息妓柜,這些信息保存在facts
變量中,以便根據(jù)被控主機(jī)信息的不同來執(zhí)行不同的操作涯穷。
關(guān)閉playbook中的變量收集
---
- hosts: all
gather_facts: no
使用adhoc收集facts變量
ansible all -m setup
facts變量?jī)?nèi)容
facts
變量是以json
格式保存的被控主機(jī)的信息棍掐,默認(rèn)包括IP、主機(jī)名拷况、磁盤作煌、掛載掘殴、CPU、內(nèi)存等信息
要查詢所有facts
變量?jī)?nèi)容粟誓,可以使用ansible node1 -m setup > setup.json
將變量保存到文件中進(jìn)行查看
常用facts變量
- IPV4地址
ansible_default_ipv4['address']
- 主機(jī)名
ansible_hostname
- 內(nèi)存
ansible_memtotal_mb
- 磁盤信息
ansible_devices
- 掛載信息
ansible_mounts
自定義facts變量
默認(rèn)情況下奏寨,setup
模塊會(huì)從被控節(jié)點(diǎn)主機(jī)上的/etc/ansible/facts.d
文件夾中獲取用戶定義變量。文件或者腳本以.fact
結(jié)尾
# 自定義fact文件
# cat custom.fact
[general]
package = httpd
service = httpd
state = started
enabled = true
# 調(diào)用自定義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變量是本機(jī)的內(nèi)容鹰服,包括inventory
文件中的內(nèi)容
---
- hosts: localhost
tasks:
- name: print magic variables
debug:
var: hostvars['localhost']