自动化运维-ansible中的变量运用
自动化运维-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: test1hosts: node1vars:- a: 1- b: 2- c:c1: 3c2: 4tasks:- name: test11debug:msg: this is {{ a }}- name: test12debug:msg: "{{ b }}"- name: test13debug:msg: "{{ c.c1 }}"- name: test14debug:var: c.c2
-
Vars_files
定义变量[student@master ansible] vim yyy # 编辑内容如下 a: 1 b: 2 c: c1: 3c2: 4
[student@master ansible] vim b.yml # 编辑内容如下 --- - name: test2hosts: node1vars_files: /home/student/ansible/yyytasks:- name: test21debug:msg: this is {{ a }}- name: test22debug:msg: "{{ b }}"- name: test23debug:msg: "{{ c.c1 }}"- name: test24debug:var: c.c2
-
register
注册变量使⽤register选项,可以将当前task的输出结果赋值给⼀个变量
以下示例:
/tmp/file1
的内容为 123321 ,/tmp/file11
不存在[student@master ansible] vim c.yml # 编辑内容如下 --- - name: test3hosts: node1tasks:- name: test31shell:cmd: cat /tmp/file1register: yy- name: test32debug:var: yy.stdout- name: test33shell:cmd: cat /tmp/file11register: yyyyignore_errors: yes- name: test34debug: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: test4hosts: node1tasks:- name: test41debug:msg: the ipv4 address of {{ ansible_hostname }} is {{ ansible_default_ipv4.address }}
-
通过命令传入变量
[student@master ansible] vim e.yml # 编辑内容如下 --- - name: test5hosts: node1tasks:- name: test51debug:msg: this is {{ aa }}- name: test52debug: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: test6hosts: node1tasks:- name: test61debug:msg: "{{ var1 }}"- name: test62debug: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: test7hosts: node1tasks:- name: test71debug:msg: "{{ var1 }}"- name: test72debug: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: test8hosts: node1tasks:- name: test81shell:cmd: echo "{{ item }}"with_items:- user1- user2- user3register: xx- name: test82debug:var: xx.results[0].stdout- name: test83debug:var: xx.results[1].stdout- name: test84debug:var: xx.results[2].stdout