环境
- 控制节点:Ubuntu 22.04
- Ansible 2.10.8
- 管理节点:CentOS 8
概述
vars
:Ansible关键字,用在play、role、block、task上register
:Ansible关键字,用在task上。注意它是一个返回值,可能需要用到其stdoutset_fact
:即ansible.builtin.set_fact
,是Ansible的module
创建文件 test1.yml
如下:
yaml
---
- hosts: all
tasks:
- name: task1
vars:
var1: "aaa"
debug:
msg: "var1 = {{ var1 }}"
- name: task2
block:
- name: part1
shell: echo "bbb"
register: var2
- name: part2
debug:
msg: "var2 = {{ var2.stdout }}"
- name: task3
block:
- name: part1
set_fact:
var3: "ccc"
- name: part2
debug:
msg: "var3 = {{ var3 }}"
运行结果如下:
powershell
➜ temp1113 ansible-playbook test1.yml
PLAY [all] *****************************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]
TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "var1 = aaa"
}
TASK [part1] ***************************************************************************************
changed: [192.168.1.55]
TASK [part2] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "var2 = bbb"
}
TASK [part1] ***************************************************************************************
ok: [192.168.1.55]
TASK [part2] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "var3 = ccc"
}
PLAY RECAP *****************************************************************************************
192.168.1.55 : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
可见,三者都可以当作变量来使用。
注意: set_fact
定义的变量,并没有真正出现在 ansible_facts
中,只是效果相同。想要验证的话,可以打印出 ansible_facts
:
yaml
debug:
#msg: "{{ ansible_facts['hostname'] }}" # 只打印某一项
msg: "{{ ansible_facts }}"
区别
作用域
vars
定义的变量,只在当前作用域有效( vars
可应用于play、role、block、task)。
register
和 set_fact
定义的变量,在之后的task和play,仍然有效。
创建文件 test2.yml
,在 test1.yml
基础上追加一个task:
yaml
- name: task4
debug:
msg: "var2 = {{ var2.stdout }}, var1 = {{ var3 }}"
运行结果如下:
powershell
......
TASK [task4] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "var2 = bbb, var1 = ccc"
}
......
创建文件 test3.yml
,在 test2.yml
基础上追加一个play:
yaml
- hosts: all
tasks:
- name: task5
debug:
msg: "var2 = {{ var2.stdout }}, var1 = {{ var3 }}"
运行结果如下:
powershell
......
PLAY [all] *****************************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]
TASK [task5] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "var2 = bbb, var1 = ccc"
}
......
可见, register
和 set_fact
所定义的变量,在之后的task和play仍然有效。
参考
https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html#playbook-keywords
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/set_fact_module.html