S_lion's Studio

(八)ansible变量

字数统计: 1.7k阅读时长: 6 min
2021/12/01 Share

列表、字典变量

列表和字典是ansible中常见的变量类型。

1
2
3
4
5
6
7
human: 
name: slions
age: 29

files:
- /tmp/a.txt
- /tmp/b.txt

对于这类变量的访问,ansible中提供了两种方式:

1
2
3
4
5
6
---
- hosts: localhost
gather_facts: false
tasks:
- debug:
msg: "name: {{human.name}}, age: {{file[0]}}"

extra-vars定义额外变量

ansible-playbook命令的-e选项或--extra-vars选项可定义变量或引入变量文件。

1
2
3
4
5
6
7
8
9
10
11
12
# 定义单个变量
$ ansible-playbook -e 'var1="value1"' xxx.yml

# 定义多个变量
$ ansible-playbook -e 'var1="value1" var2="value2"' xxx.yml

# 引入单个变量文件
$ ansible-playbook -e '@varfile1.yml' xxx.yml

# 引入多个变量文件
$ ansible-playbook -e '@varfile1.yml' -e '@varfile2.yml' xxx.yml

因为是通过选项的方式来定义变量的,所以它所定义的变量是全局的,对所有play都有效。

inventory变量

在解析inventory时,会收集inventory相关的变量。

inventory变量主要分为两种:

  1. 连接目标节点时的行为控制变量,即决定如何连接目标节点
  2. 主机变量

行为控制变量(如ansible_port、ansible_host等)用于指定Ansible端连接目标节点时的连接参数,可设置的参数项比较多,可参见官方手册

inventory的主机变量有多种定义途径,例如直接在inventory文件中为某个主机定义变量,也可以在主机组中定义变量,主机组变量会在解析inventory的时候整理到主机变量中去。此外还可以将变量定义在host_vars/和group_vars/目录内,可参考前文

role变量

Role中主要有两个地方定义变量:

  1. roles/ROLE_NAME/defaults/main.yml
  2. roles/ROLE_NAME/vars/main.yml

Role defaults变量的优先级非常低,几乎可以被其它任何同名变量覆盖。

Role变量都是play级别的变量。换句话说,如果play中执行了Role之后还有tasks指令的任务,则tasks的任务中可以引用Role中的变量。

1
2
3
4
5
6
7
8
---
- hosts: localhost
gather_facts: false
roles:
- role: test_role
tasks:
- debug:
var: var_from_role

play变量

play级别可以通过varsvars_filesvars_prompt指令来定义变量。因为它们属于play级别,所以只在当前play有效。另一方面,每个play都有选中的目标节点,所有选中的目标节点都能访问这些play变量。

vars

vars比较简单不多说了。

vars_files

vars_files是一个play级别的指令,可用于在解析playbook的阶段引入一个或多个保存了变量的外部文件。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
---
- name: play1
hosts: localhost
gather_facts: false
vars_files:
- varfile1.yml
- varfile2.yml
tasks:
- debug:
msg: "var in varfile1: {{var1}}"
- debug:
msg: "var in varfile2: {{var2}}"

playbook文件通过vars_files引入了两个变量文件,变量文件的写法要求遵守YAML或JSON格式。下面是这两个文件的内容:

1
2
3
4
5
6
7
8
9
# 下面是varfile1.yml文件的内容
---
var1: "value1"
var11: "value11"

# 下面是varfile2.yml文件的内容
---
var2: "value2"
var22: "value22"

需要说明的是,vars_files指令是play级别的指令,且是在解析playbook的时候加载并解析的,所以所引入变量的变量是play范围内可用的,其它play不可使用这些变量。

vars_prompt

vars_prompt指令用于交互式提示用户输入数据,并将输入内容赋值给指定的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- hosts: localhost
gather_facts: false
vars_prompt:
- name: username
prompt: "请输入你的用户名"
private: no
default: root

- name: passwd
prompt: "请输入你的登录密码"
tasks:
- name: 验证用户输入
debug:
msg: "用户名: {{username}},密码: {{passwd}}"

上面定义了两个变量usernamepasswd,都会提示用户输入对应的值。private: no表示不要隐藏用户输入的字符(默认会隐藏),default表示指定变量的默认值。

task变量

task变量有多种定义方式:

  1. register指令
  2. set_fact指令
  3. vars指令
  4. include_vars指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
- hosts: localhost
gather_facts: false
tasks:
# var.yml变量文件中定义了变量a
- include_vars:
file: var.yml

- shell: echo junmajinlong
register: res
- set_fact: name="{{res.stdout}}"

- debug:
msg: "a: {{a}}, name: {{name}}, age: {{age}}"
vars:
age: 18
gender: male

其中include_vars指令除了指明文件位置,还可从目录中导入多个文件,默认会递归到子目录中。

1
2
3
- name: Include all files in vars/all
include_vars:
dir: vars/all

block变量

ansible中使用block指令来组织了两个有关联性的任务,将它们作为了一个整体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
- name: sync time
hosts: new
gather_facts: false
tasks:
- name: install and sync time
block:
- name: install ntpdate
yum:
name: ntpdate
state: present

- name: ntpdate to sync time
shell: |
ntpdate ntp1.aliyun.com
hwclock -w

block作为一个特殊的层次级别,它也支持定义变量,只不过这个block层次的变量只对当前block内的所有任务有效。

1
2
3
4
5
6
7
8
9
---
- hosts: localhost
gather_facts: false
tasks:
- block:
- debug:
var: name
vars:
name: "slions"

facts变量

Facts信息也算是变量,可参考前文

预定义特殊变量

ansible自身维护了一些可以暴露给用户的预定义变量,官方称为魔法变量,下面是常见预定义变量的含义,完整的预定义特殊变量说明参考官方手册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
- ansible_forks
表示最大的进程数。这也暗含了多少个节点作为一批。(如果忘记了一批是什么意思,可回介绍playbook的那一章末尾复习)

- hostvars
保存了inventory中所有主机和主机变量

- inventory_hostname
当前执行任务的节点在inventory中的主机名

- inventory_hostname_short
当前执行任务的节点在inventory中的短主机名

- inventory_dir
inventory文件所在的目录

- inventory_file
inventory文件名

- group_names
当前正在执行任务的节点所在主机组列表,注意是一个列表,因为一个节点可能存在于多个主机组

- groups
inventory中所有的主机组以及各组内的主机列表

- ansible_play_batch
当前play中可执行任务的主机列表。Ansible动态维护该变量,默认情况下执行任务失败或连接失败的节点会从此变量中移除

- ansible_play_hosts
等价于ansible_play_batch

- play_hosts
已废弃,等价于ansible_play_batch

- playbook_dir
playbook所在目录,该playbook是ansible-playbook命令所执行的playbook,而不是import_playbook导入的playbook

- ansible_play_name
当前正在执行的play的name。Ansible 2.8才添加的变量

- ansible_play_hosts_all
当前play所选中的所有节点,等价于ansible_play_batch + 失败的节点

- ansible_play_role_names
当前play中包含的Role列表。注意,因依赖关系而隐式导入的Role不在列表内

- role_names
已废弃,等价于ansible_play_role_names

- ansible_role_names
当前play中包含的Role列表,包括因依赖关系而隐式导入的Role

- role_name
当前正在执行的Role的名称

- role_path
当前正在执行的Role的路径

CATALOG
  1. 1. 列表、字典变量
  2. 2. extra-vars定义额外变量
  3. 3. inventory变量
  4. 4. role变量
  5. 5. play变量
    1. 5.1. vars
    2. 5.2. vars_files
    3. 5.3. vars_prompt
  6. 6. task变量
  7. 7. block变量
  8. 8. facts变量
  9. 9. 预定义特殊变量