列表、字典变量
列表和字典是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]}}"
|
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变量主要分为两种:
- 连接目标节点时的行为控制变量,即决定如何连接目标节点
- 主机变量
行为控制变量(如ansible_port、ansible_host等)用于指定Ansible端连接目标节点时的连接参数,可设置的参数项比较多,可参见官方手册
inventory的主机变量有多种定义途径,例如直接在inventory文件中为某个主机定义变量,也可以在主机组中定义变量,主机组变量会在解析inventory的时候整理到主机变量中去。此外还可以将变量定义在host_vars/和group_vars/目录内,可参考前文。
role变量
Role中主要有两个地方定义变量:
roles/ROLE_NAME/defaults/main.yml
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级别可以通过vars
、vars_files
、vars_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
| --- var1: "value1" var11: "value11"
--- 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}}"
|
上面定义了两个变量username
和passwd
,都会提示用户输入对应的值。private: no
表示不要隐藏用户输入的字符(默认会隐藏),default
表示指定变量的默认值。
task变量
task变量有多种定义方式:
- register指令
- set_fact指令
- vars指令
- 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: - 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的路径
|