变量
- playbook的变量有以下几种
- 在playbook中用户自定义的变量
- 远程主机中由Ansible收集的变量
- 在文件模板中使用的上述两种变量
- 把任务结果作为一个变量使用,叫注册变量
- 用户在执行playbook时,通过命令行传入的变量,叫做额外变量
在playbook中用户自定义的变量
playbook中定义变量
- 在playbook中定义的变量,称为局部变量,只能在当前的playbook中使用
- 用户可以使用
vars
关键字 在playbook中定义变量 - 使用
{{ var_name }}
来引用变量
把变量放在单独的文件中
- 可以把变量放在单独的文件中,然后在playbook中使用
vars_files
关键字引入变量文件 - 变量文件的后缀名可以是
.yml
或者.yaml
- 使用文件中变量的方法与 在playbook中定义变量的方法相同
定义和使用复杂变量
foo:
field1: one
field2: two
foo['field1']
foo.field2
yaml的陷阱
- 变量引用时,如果提示语法错误,可以在引用变量的{}外加上""引号
远程主机系统变量(Facts)
- Ansible会在每次执行任务时,收集远程主机的系统信息,这些信息会被存储在一个叫做Facts的变量中
- 可以使用
setup
模块来查看Facts变量的内容,查看方式如下
ansible all -m setup
使用Facts变量
- 在playbook中可以直接使用Facts变量
- Facts变量是一种多层级的,遵守yaml规范的复杂的变量,如下:
"ansible_device_links": {
"ids": {
"sda": [
"scsi-36002248079f9f66f426ea82fb0957801",
"wwn-0x6002248079f9f66f426ea82fb0957801"
],
"sdb": [
"scsi-36002248019fafe73e00cc6e7e8b292d5",
"wwn-0x6002248019fafe73e00cc6e7e8b292d5"
]
}
}
- 可以通过以下两种方式访问复杂变量中的子属性
- 中括号
{{ansible_ens3["ipv4"]["address"]}}
- 点号
{{ansible_ens3.ipv4.address}}
关闭Facts变量
- 注意,在实际playbook运行中,收集
Facts
变量需要消耗额外的时间,因此在不使用Facts变量的情况下,可以使用gather_facts
来控制是否使用远程变量
- hosts: whatever
gather_facts: no
文件模板中使用的变量
template中变量的定义
- 在playbook中定义的变量
- Facts变量
- inventory中定义的host和group变量
template中变量的使用
- 使用
Jinja2
语言书写模板文件 - 需要了解
{{}}
用来引用变量即可
注册变量
- 将任务的执行结果当作一个变量,这个变量叫做注册变量
- 关键字
register
,后面跟注册变量名称 - 在后续中,通过名称来引用注册变量
- 通常配合
debug
模块一同使用:
debug
模块可用于在playbook执行过程中输出一些需要的信息
---
- name: Register test
hosts: '127.0.0.1'
tasks:
- name: Register test
ansible.builtin.shell: ls
register: aaa
ignore_errors: true
- shell: echo "{{aaa.stdout_lines}}" > /tmp/reg.log
- debug: msg="{{aaa.stdout_lines}}"
命令行传递参数
- 用户在执行时传入变量的值:“额外变量”或者叫“命令行变量”
定义命令行变量
- 直接在playbook中引用需要的变量
- 如在执行Playbook时不传递变量,则会报错
- 如果在执行命令时候传递Playbook中已定义的变量,会覆盖Playbook中变量的值
使用命令行变量
- 直接传递
ansible-playbook test.yml --extra-vars "host=web"
- JSON格式参数传递
ansible-playbook test.yml --extra-vars "{'host':'web'}"
- 将变量参数放在文件中
ansible-playbook test.yml --extra-vars "@vars.json"