自动化运维-ansible中的变量运用
一、变量命名规则
- 组成:字母、数字、下划线。
- 必须以字母开头。
- 合法:
app_port
,web_1
,varA
- 非法:
2_var
(以数字开头),my-var
(包含其他字符),_private
(以下划线开头)
- 合法:
- 避免使用内置关键字:例如
hosts
,tasks
,name
,vars
,when
,register
等。
二、变量的优先级
- Global范围(高):从命令行和ansible配置设置的变量
- play范围(中):set_fact、register和在play和相关结构中设置的变量
- Host范围(低):inventory、facts的变量,在主机组和个别主机上设置的变量
命令行 > Playbook 中的设置 > Inventory 中的设置 > 角色默认值
越“具体”的设置,优先级越高
三、注册和定义变量的各种方式
vars
定义变量Vars_files
定义变量register
注册变量set_fact
定义变量- 通过命令传入变量
- 主机清单中的变量
- 内置变量
With_itens
叠加变量
四、对各种方式的示例
vars
定义变量[student@master ansible] vim a.yml # 编辑内容如下 --- - name: test1 hosts: node1 vars: - a: 1 - b: 2 - c: c1: 3 c2: 4 tasks: - name: test11 debug: msg: this is {{ a }} - name: test12 debug: msg: "{{ b }}" - name: test13 debug: msg: "{{ c.c1 }}" - name: test14 debug: var: c.c2
Vars_files
定义变量[student@master ansible] vim yyy # 编辑内容如下 a: 1 b: 2 c: c1: 3 c2: 4
[student@master ansible] vim b.yml # 编辑内容如下 --- - name: test2 hosts: node1 vars_files: /home/student/ansible/yyy tasks: - name: test21 debug: msg: this is {{ a }} - name: test22 debug: msg: "{{ b }}" - name: test23 debug: msg: "{{ c.c1 }}" - name: test24 debug: var: c.c2
register
注册变量使⽤register选项,可以将当前task的输出结果赋值给⼀个变量
以下示例:
/tmp/file1
的内容为 123321 ,/tmp/file11
不存在[student@master ansible] vim c.yml # 编辑内容如下 --- - name: test3 hosts: node1 tasks: - name: test31 shell: cmd: cat /tmp/file1 register: yy - name: test32 debug: var: yy.stdout - name: test33 shell: cmd: cat /tmp/file11 register: yyyy ignore_errors: yes - name: test34 debug: var: yyyy.stdout
如图所示:无论输出结果是否正确,都会赋值给自定义的变量
set_fact
定义变量可以将某个变量的值赋值给另⼀个变量,也可以将字符串赋值给变量
事实变量是 Ansible 自动发现并设置的关于受控主机的系统信息和属性的变量
每个主机都有自己独有的一套事实变量,是Ansible预定义的,有固定的命名格式(通常以
ansible_
为前缀),你不能随意改变这些变量的名字[student@master ansible] ansible node1 -m setup > z
使用
ansible 主机名 -m setup
可以查看主机的所有事实变量为了方便查找,一般会重定向到自定义的文件中
常用变量名 对应的含义 ansible_default_ipv4.address
ipv4地址 ansible_enp1s0.ipv4.address
ansible_网卡名称.ipv4.address ansible_fqdn
完全合格域名(FQDN) ansible_hostname
主机名称 ansible_memtotal_mb
内存大小 ansible_bios_version
bios版本 ansible_devices.vda.size
vda硬盘大小 ansible_devices.vdb.size
vdb硬盘大小 ansible_lvm.vgs
逻辑卷中卷组 [student@master ansible] vim d.yml # 编辑内容如下 --- - name: test4 hosts: node1 tasks: - name: test41 debug: msg: the ipv4 address of {{ ansible_hostname }} is {{ ansible_default_ipv4.address }}
通过命令传入变量
[student@master ansible] vim e.yml # 编辑内容如下 --- - name: test5 hosts: node1 tasks: - name: test51 debug: msg: this is {{ aa }} - name: test52 debug: var: bb
主机清单中的变量
在主机清单中定义变量
[student@master ansible] vim inventory # 编辑内容如下 node5 [testa] node1 node2 [testa:vars] var1='ni' var2='hao' [testb] node3 node4
[student@master ansible] vim f.yml # 编辑内容如下 --- - name: test6 hosts: node1 tasks: - name: test61 debug: msg: "{{ var1 }}" - name: test62 debug: msg: var2
除了可以在主机清单里定义变量外,还可以在 /etc/ansible(root用户)或 /home/用户名/ansible(普通用户) 目录下创建group_vars和host_vars目录下定义变量
node1文件名以主机命名,还可以命名为node1.yml
[student@master ansible] mkdir host_vars [student@master host_vars] vim node1 [student@master host_vars] vim node1.yml
# 在 node1 中编辑内容如下 var1: t1 var2: t2 # 在 node1.yml 中编辑内容如下 var1: t3 var2: t4
编辑 playbook ,看输出变量的值
[student@master ansible] vim g.yml # 编辑内容如下 --- - name: test7 hosts: node1 tasks: - name: test71 debug: msg: "{{ var1 }}" - name: test72 debug: var: var2
发现输出结果为 node1 中定义的值
如果node1与node1.yml同时存在,则 node1的优先级更高
除了在 host_vars 目录下,在 group_vars 目录下也同理
如果 host_vars 目录和 group_vars 目录同时存在,则 host_vars 的优先级更高
内置变量
是 Ansible 自动预定义和设置的变量。你无需使用
set_fact
或vars
来声明它们为你提供关于当前运行环境、Inventory(清单)、Playbook 本身以及连接信息等重要上下文
常用变量名 对应作用 ansible_version
显示ansible的版本 inventory_hostname
显示主机清单主机名称 play_hosts
显示当前playbook实际要操作的所有主机的列表 groups
显示主机清单中的组与主机的对应关系 groups.all
显示所有清单主机 group_names
显示主机的主机组的名称 inventory_dir
显示主机清单所在的目录 With_itens
叠加变量可以给一个变量赋予多个值
让一个任务对列表中的每个项目执行一次
[student@master ansible] vim h.yml # 编辑内容如下 --- - name: test8 hosts: node1 tasks: - name: test81 shell: cmd: echo "{{ item }}" with_items: - user1 - user2 - user3 register: xx - name: test82 debug: var: xx.results[0].stdout - name: test83 debug: var: xx.results[1].stdout - name: test84 debug: var: xx.results[2].stdout