定义与使用变量
定义方式:
- 命令行中定义变量
- 在剧本或专门的文件中定义变量
- 根据主机分组
- ansible内置facts:获取主机名,ip,cpu信息等
变量名只能由字母、数字和下划线组成,且必须以字母开头。
使用变量的格式为{{ variable_name }}
。例如path=/root/{{ name }}.txt
命令行中引用变量
使用-e参数在命令行中定义变量
ansible web -e 'file=/etc/hostname' -a 'cat {{ file }}'
剧本中或专门文件定义变量
剧本中
通过剧本play部分vars定义变量,剧本中paly部分vars_files指定变量,通过group_vars指定主机组共享变量文件。
示例
debug_var.yaml
- hosts: web
vars:
file: /etc/hostname
tasks:
- name: print var
debug:
msg: 变量的内容是{{ file }}
- name: print file content
command:
cmd: cat {{ file }}
注意:当在字符串中使用变量插值时,通常需要用引号将变量插值部分包围起来,尤其是在变量插值出现在字符串的开始位置时。
异常示例
- hosts: web
vars:
file: /etc/hostname
tasks:
- name: print var
debug:
msg: {{ file }} 是变量的内容
msg
字段的值应该被双引号包围,并且{{ file }}
变量插值也应该被双引号包围,以确保YAML解析器能够正确识别和处理
- hosts: web
vars:
file: /etc/hostname
tasks:
- name: print var
debug:
msg: "{{ file }} 是变量的内容"
变量文件
直接定义一个yaml文件,在文件中写入相应的变量 key: value格式
vars.yaml
hosts_file: /etc/hosts
user: guoguo
使用变量文件
use_vars.yaml
- hosts: web
vars_files: vars.yaml
tasks:
- name: get hosts_file
command:
cmd: cat {{ hosts_file }}
- name: create user guoguo
user:
name: "{{ user }}"
uid: 2023
shell: /bin/bash
home: /home/{{ user }}
根据主机清单自动识别变量 group_vars
在Ansible中,group_vars
是用于存放与主机组相关的变量的目录。这些变量可以在playbook中通过{{ variable_name }}
语法引用,以实现对不同主机组进行不同的配置。
以下是如何使用group_vars
的步骤:
- 创建
group_vars
目录:首先,在Ansible的inventory文件所在的目录中创建一个名为group_vars
的目录。 - 定义主机组变量:在
group_vars
目录中,为每个主机组创建一个YAML文件,文件名与主机组名相同。例如名为web
的主机组,则在group_vars
目录中创建一个名为web.yml
的文件。
在web.yml
文件中,你可以定义适用于该主机组的变量。例如:
web.yml
group: web
web_proxy.yml
group: web_proxy
- 加载
group_vars
:Ansible会自动加载group_vars
目录中的变量文件,并在执行playbook时将其应用于相应的主机组。 - 在Playbook中使用变量:在你的playbook中,你可以通过
{{ variable_name }}
语法引用这些变量。例如:
- name: test group_vars
hosts: web
tasks:
- name: 显示web主机组变量
debug:
msg: "{{ group }} is current group"
- name: test group_vars
hosts: web_proxy
tasks:
- name: 显示web_proxy主机组变量
debug:
msg: "{{ group }} is current group"
在这个例子中,{{ group}}
将被替换为从group_vars/web.yml group_vars/web_proxy.yml
文件中识别出的group:
变量的值。
请注意,对于不同的Ansible命令行,group_vars
目录的查找路径可能会有所不同。如果是使用ansible-playbook
命令,Ansible会去当前playbook所在文件的同级目录下去查找group_vars
目录。如果是使用ansible
或ansible-console
命令行,则会去当前playbook所在文件统计目录下的inventory
文件夹下去查找group_vars
目录。
确保你的inventory文件正确加载了主机组,并且playbook中引用了正确的变量名。你可以使用Ansible的调试功能来验证变量是否被正确识别和应用。
注意,也可以将各个分组的变量文件放到分组名的目录下。
上文即可修改为
group_vars/web/var.yml
group_vars/web_proxy/var.yml
执行结果不变
all
注意:如果有分组中有all,则设定为默认的。凡是没有匹配到的,使用all的变量配置。
验证:
移除web,添加all
group_vars/all/var.yml
group: all
运行结果有变化