Ansible 变量 Vars
ansible 变量的引用
Ansible 变量
系统自动化让重复的工作变得更加容易,但是每个系统还是有一些细微的差别,变量就是如何处理系统之间的不同之处。这里将会列出变量的极大部分使用方法。
本文假设:你已经知道如何使用 Ansible。知道 inventory,facts 等概念。
Ansible 定义变量的几中方式
1、在清单 (inventory) 中定义变量
2、在 playbook 中定义变量,使用 var,或 var_files:
3、在 role 中定义变量
4、自定义 facts 的变量
5、Register facts , 使用 task 返回结果作为变量
6、从命令行传递变量 -e
使用变量,除了可用使用自定义的变量,还可以使用 facts 和其它主机的变量。
一、合法变量名
1、必须是字符,数字,下划线组成,变量必须以字符开头。
2、变量支持字典形式的映射。
3、有时候引用变量,使用小数点形式的引用方法可能会和 Python 内置的属性和方法冲突。建议使用 [] 形式。
二、开始定义与使用变量
1、清单 (inventory) 变量
1.1 定义清单主机变量. 在对应的主机后面,提供 key=value 形式语句,即可。格式如下
[webserver]
172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars"
172.16.1.20 ansible_ssh_user=root
1.2 定义清单组变量,格式如下。
[all:vars]
[webserver:vars]
inventory_group_var="Group_vars"
1.3 可以根据对应的 inventory 创建文件,写入变量
mkdir /etc/ansible/host_vars #Ansible 会默认读取此目录下对应的主机名文件
mkdir /etc/ansible/group_vars #同上
vim /etc/ansible/host_vars/all 或者 vim /etc/ansible/host_vars/hostname
vim /etc/ansible/group_vars/groupname
在文件中写入变量即可。格式为 ymal 格式文件。
2、在 playbook 中定义变量
---
- hosts: hostname or groupname
vars: # 1. playbook 中定义变量的关键字
playbook_var: Playbook_vars
vars_files: # 2. 使用变量文件
- filename.yml
tasks:
- name: Copy Jinja2 file to remote host
template: src=../../../home/aheahe/var_tu.j2 dest=/root/var.conf
3、在 roles 中定义变量
创建 role 结构
mkdir -p roles/test/{defaults,vars,files,templates,tasks,handlers}
vim roles/test/vars/main.yml
#1、编辑 task 文件
role_vars_var: Role_vars_var
vim roles/test/defaults/main.yml
#2、编辑默认变量文件
role_defaults_var: Role_default_var
vim roles/test/tasks/main.yml
#3、编辑 roles var 文件
- name: Learn role vars
template: src=src.j2 dest=/root/result.txt
vim roles/test/templates/src.j2
#4、编辑模板文件
{{ role_vars_var }}
{{ role_defaults_var }}
vim site.yml
#5、编辑执行文件
- hosts: 172.16.1.10
roles:- /home/aheahe/roles/test
ansible-playbook site.yml
#6、执行
- /home/aheahe/roles/test
[172.16.1.10~]# cat result.txt #7、在被管理节点上查看结果
Role_vars_var
Role_default_var
Tip:在引用 role 的时候,还可以传递变量给 role
- hosts: webservers
roles:- common
- { role: test, role_defaults_var: 'var_value' }
- common
4、自定义 Facts 变量。
如果在被管理的主机上存在 /etc/ansible/facts.d
目录,其中的以. fact 为文件结尾的 JSON 格式或者 YML 格式文件都会当做自定义 facts。
[172.16.1.10]vim /etc/ansible/facts.d/local.fact
#编辑自定义 facts 文件
[general]
Aheahe=aihe
local="Local facts"
[ansible ~]$ansible 172.16.1.10 -m setup -a 'filter=ansible_local' #在 ansible 控制节点查看自定义 facts 变量是否生效
172.16.1.10 | success >> {
"ansible_facts": {
"ansible_local": {
"local": {
"general": {
"aheahe": "aihe",
"local": "\"Local facts\""
}
}
}
},
"changed": false
}
可以像 fact 一样使用,自定义的 fact 变量。
vim roles/test/templates/src.j2 #使用刚才的角色
{{ role_vars_var }}
{{ role_defaults_var }}
{{ ansible_local.local.general.local }}
ansible-playbook site.yml #执行刚才的 site.yml
[172.16.1.10 -]# cat /root/result.txt #被管理节点查看结果,显示正确
Role_vars_var
Role_default_var
"Local facts"
4.1 这里还可以在控制节点上面传递自定义变量到被管理节点,编辑如下 yaml 格式文件。
- hosts: webservers
tasks:- name: create directory for ansible custom facts
file: state=directory recurse=yes path=/etc/ansible/facts.d - name: install custom impi fact
copy: src=ipmi.fact dest=/etc/ansible/facts.d - name: re-readfacts after adding custom fact
setup: filter=ansible_local
- name: create directory for ansible custom facts
5、定义 Register 变量 将 task 的结果信息当做变量使用,register: 定义的名称就是变量名
Register 是把任务的输出定义为变量,然后用于其他任务
Register 变量是将 task 的结果信息当做变量使用。在任务的执行结果后面加上 register 关键字即可定义变量vim study.yml
---
- hosts: 172.16.1.10
vars:
playbook_var: Playbook_vars
tasks:
- name: Learn Register
shell: ifconfig
register: result
- name: Test register
shell: date
when: result.rc == 0
ansible-playbook study.yml -v
#执行的时候加上 -v 选项。查看输出信息
6、从命令行传递变量.
相信这点对大家来说已经不成问题了, 便不再细说
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo" #传递 key=value 形式变量
--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}' #传递 JSON 格式变量
--extra-vars "@some_file.json" #传递 JSON 格式文件变量
三、使用变量
上面在举例子的时候,已经说明如何使用了。下面介绍如何使用 fact 变量和一台主机使用另外一台主机的变量。
使用实现定义好的变量,在变量两边加上大括号,格式为 var_name
1、在 Jinja2 文件里面使用变量
vim var.j2
{{ ansible_hostname }} #这里是使用 fact 变量,两个主机的结果不一样
{{ hostvars['172.16.1.10']['ansible_hostname'] }} #这里两台主机的结果一样,node2 > 使用 node1 的变量
vim test.yml #提供剧本
- hosts: webserver
tasks:- name: Use fact and other host vars
template: src=../../../home/aheahe/playbook/var.j2 dest=/root/var.conf
ansible-playbook test.yml #执行
[root@node1]# cat /root/var.conf #这里可以看到 node2 使用 node1 的变量。
node1 #这里是使用 fact 变量,两个主机的结果不一样
node1 #这里两台主机的结果一样,node2 使用 node1 的变量
- name: Use fact and other host vars
2、在 task 里面使用变量。
tasks:
- name: create a virtual host file for{{ vhost }} #假设已经定义 vhost 变量
template: src=somefile.j2dest=/etc/httpd/conf.d/{{ vhost }}
四、变量范围
Ansible 主要活动在三个范围 (Scope)
全局变量 (Global): 通过配置文件,环境变量和命令行设置
Playbook变量 (Play): 每个 play 包含的使用 vars,include_vars, 定义的变量和 role 的 defaults 和 vars 目录下的变量
主机变量 (Host): 直接分配给主机的变量,像 inventory,facts 或 register task 输出。
五、变量的优先级。
处理同一个变量名多处定义的问题。
3.1、在 1.x 版本里面,越靠下优先级越高,下面可以覆盖上面的
1、role defaults 中定义的变量,优先级最低
2、从被管理系统中收集的 facts 信息
3、inventory 中定义的变量
4、在 playbook 中的 vars: 或者 roles 中的 vars
5、一些连接变量,例如 ansible_user 。
6、命令行的变量 ansible-playbook -e 选项的变量, 优先级别最高。
3.2 , 在 2.x 系列的版本中调整变量优先级的顺序为如下。优先级由低到高
Playbook 变量覆盖
role defaults [1]
inventory file or script group vars [2]
inventory group_vars/all
playbook group_vars/all
inventory group_vars/*
playbook group_vars/*
inventory file or script host vars [2]
inventory host_vars/*
playbook host_vars/*
host 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)
role (and include_role) params
include params
include_vars
set_facts / registered vars
--extra-vars ((命令行中 -e 指定优先级最高))
[1] Tasks in each role will see their own role’s defaults. Tasks defined outside of a role will see the last role’s defaults.
2 Variables defined in inventory file or provided by dynamic inventory.
1. 通过命令行传递变量(extra vars)
ansible-playbook release.yml -e "user=starbuck"
2. 在 inventory 中定义变量(inventory vars)
host3 http_port=80 # 定义主机变量
[webservers:vars] # 定义组的变量
ntp_server= ntp.example.com
3. 在 playbook 中如何定义变量(play vars)
- hosts: webservers
vars:
http_port: 80
4. 从角色和文件包含中定义变量
hosts: webservers
include_vars: myvars.ymlhosts: webservers
vars_files:- /vars/external_vars.yml
- /vars/external_vars.yml
5. 定义角色默认的变量(role defaults)
在角色目录中添加一个 defaults/main.yml
文件。文件里存储着 yaml 或 json 格式的数据。
6. 以交互方式获取变量值
- hosts: server
vars_prompt:- name: web
prompt: 'Please input the web server:'
private: no
- name: web
7. 定义角色变量(role and include vars)
roles:
- { role: app_user, name: Jane }
8. 注册变量(registered vars)
- hosts: all
tasks:- shell: uptime
register: result - name: show uptime
debug: var=result
- shell: uptime
此选项将任务的结果存储在变量中,结果参数可以用在模版中。名称为 result,使用 debug 来输出 result 的信息。
以下是一些重要的注册变量的组件:
changed: 显示是否已更改
cmd: 执行的命令
rc: 命令的返回码
stdout: 命令的输出
stdout_lines: 逐行输出
stderr: 如果有错误,则输出错误的信息
内置变量
变量名称 说明 使用
hostvars 包含主机得 fcats 信息 {{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}
inventory_hostname 当前主机的名称 {{ hostvars[inventory_hostname] }}
groups_name 当前主机所在组的主机列表 {% if 'webserver' in group_names %}# some part of a configuration file that only applies to webservers{% endif %}
groups 包含设备清单组内的所有主机 {% for host in groups[‘db_servers’] %} {{ host }}{% endfor %}
play_hosts 在当前 playbook 中处于活动状态的主机名列表 {{play_hosts}}
ansible_version ansible 版本信息 {{ansible_version}}