我们可以在文件中定义变量,也可以在命令行传入变量,或者使用register变量(记录task的返回结果)。
变量可用作module参数,也可用于“when”语句、template、循环语句。
变量名只能由字母、数字、下划线组成,且不能以数字开头。变量名不能与Python关键字和playbook关键字重名。
比如:
foo
foo1
foo_1
_foo
foo-1
foo.bar
1foo
else
例如:
---
- hosts: all
vars:
var1: "abc" # 定义变量var1
tasks:
- name: task1
debug:
msg: "hello {{ var1 }}" # 使用变量var1
看下面的例子:
---
- hosts: all
vars:
var1: aaa
var2: bbb{{ var1 }}
tasks:
- name: task1
debug:
msg: hello {{ var2 }} # hello bbbaaa
本例中,使用变量的地方没有加引号。
但是,如果一个值以变量开头(确切说是以 {
开头),则必须用引号引起来,比如:
---
- hosts: all
vars:
var1: aaa
var2: "{{ var1 }}bbb" # 此处要用引号引起来,否则报错
tasks:
- name: task1
debug:
msg: hello {{ var2 }} # hello aaabbb
这是因为,如果不引起来,则 {
被看做是dictionary的开头。比如:
---
- hosts: all
vars:
var1: {name: Tom, age: 20}
tasks:
- name: task1
debug:
msg: hello {{ var1.name }} # hello Tom
总之,为了避免混淆,最好是都加上引号。比如:
---
- hosts: all
vars:
var1: "aaa"
var2: "{{ var1 }}bbb"
tasks:
- name: task1
debug:
msg: "hello {{ var2 }}" # hello aaabbb
True
'true'
't'
'yes'
'y'
'on'
'1'
1
1.0
False
'false'
'f'
'no'
'n'
'off'
'0'
0
0.0
有两种定义方法:
sport:
- football
- basketball
- swim
sport: [football, basketball, swim]
对于list变量,可以通过下标获取其中某个元素,比如:
---
- hosts: all
vars:
var1:
- football
- basketball
- swim
var2: [football, basketball, swim]
tasks:
- name: task1
debug:
msg: "{{ var1[1] }}" # basketball
- name: task2
debug:
msg: "{{ var2[1] }}" # basketball
有两种定义方法:
person:
name: Tom
age: 20
person: {name: Tom, age: 20}
对于dictionary变量,可以通过key获取其对应的value。下面两种方法都可以:
var1.key1
var1['key1']
比如:
---
- hosts: all
vars:
var1:
name: Tom
age: 20
var2: {name: Tom, age: 20}
tasks:
- name: task1
debug:
msg: "{{ var1.name }}" # Tom
- name: task2
debug:
msg: "{{ var2['age'] }}" # 20
---
- hosts: all
tasks:
- name: task1
shell: cat /tmp/a.txt
register: result
- name: task2
debug:
msg: "OK"
when: result.stdout == 'yes'
注:如果task fail或者被skip了,其register变量也会记录fail或者skipped状态。
比如:
- hosts: all
vars:
var1: xxx
var2: xxx
tasks:
- name: task1
debug:
msg: "{{ var1 }}"
比如:
- hosts: all
vars_files:
- myvars1.yml
- myvars2.yml
tasks:
- name: task1
debug:
msg: "{{ var1 }}"
myvars1.yml
内容如下:
var1: aaa
var2: bbb
......
使用 --extra-vars
(或 -e
)选项。
有以下几种方式:
比如:
ansible-playbook test1.yml --extra-vars "var1=aaa var2=bbb"
比如:
ansible-playbook test1.yml --extra-vars '{"var1":aaa,"var2":bbb}'
注:JSON的key必须用引号引起来,而YAML的key不用引号。
本例中使用了单引号和双引号嵌套的方式。如果都用双引号,则需要用 \
转义:
ansible-playbook test9.yml --extra-vars "{\"var1\":aaa,\"var2\":bbb}"
比如:
ansible-playbook test1.yml --extra-vars "@myvars1.yml" --extra-vars "@myvars2.yml"
或者:
ansible-playbook test1.yml --extra-vars "@myvars1.json" --extra-vars "@myvars2.json"
myvars1.json
内容如下:
{
"var1": aaa
}
貌似这里key不加引号也OK,但是最好还是加上吧。
如果在多处定义同一个变量,则会根据以下规则决定变量的取值(优先级从低到高):
-e "user=my_user"
)(always win precedence)https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html