Ansible的变量
2023-12-26 11:36:20
文章目录
环境
- 管理节点:Ubuntu 22.04
- 控制节点:CentOS 8
- Ansible:2.15.6
概述
我们可以在文件中定义变量,也可以在命令行传入变量,或者使用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
list
有两种定义方法:
- 方法1:
sport:
- football
- basketball
- swim
- 方法2:
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
dictionary
有两种定义方法:
- 方法1:
person:
name: Tom
age: 20
- 方法2:
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
register变量
---
- 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状态。
在何处定义变量
在play中定义变量
比如:
- 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
)选项。
有以下几种方式:
- key=value格式
比如:
ansible-playbook test1.yml --extra-vars "var1=aaa var2=bbb"
- json格式
比如:
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,但是最好还是加上吧。
变量查找的优先级
如果在多处定义同一个变量,则会根据以下规则决定变量的取值(优先级从低到高):
- command line values (for example, -u my_user, these are not variables)
- role defaults (defined in role/defaults/main.yml)
- inventory file or script group vars
- inventory group_vars/all
- playbook group_vars/all
- inventory group_vars/*
- playbook group_vars/*
- inventory file or script host vars
- inventory host_vars/*
- playbook host_vars/*
- host facts / cached set_facts
- play vars
- play vars_prompt
- play vars_files
- role vars (defined in role/vars/main.yml)
- block vars (only for tasks in block)
- task vars (only for the task)
- include_vars
- set_facts / registered vars
- role (and include_role) params
- include params
- extra vars (for example,
-e "user=my_user"
)(always win precedence)
变量的作用范围
- Global:由配置、环境变量、命令行设定。
- Play:每个play及所包含的结构、vars、vars_files、vars_prompt、role defaults、vars。
- Host:直接关联于host的变量,比如inventory、include_vars、facts或者registered task结果。
参考
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_variables.html
文章来源:https://blog.csdn.net/duke_ding2/article/details/135121699
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!