定义与使用变量

定义方式:

  • 命令行中定义变量
  • 在剧本或专门的文件中定义变量
  • 根据主机分组
  • ansible内置facts:获取主机名,ip,cpu信息等

变量名只能由字母、数字和下划线组成,且必须以字母开头。


使用变量的格式为{{ variable_name }}。例如path=/root/{{ name }}.txt


命令行中引用变量

使用-e参数在命令行中定义变量

ansible web -e 'file=/etc/hostname' -a 'cat {{ file }}'

Ansible学习笔记11:变量(用户定义)_Ansible


剧本中或专门文件定义变量

剧本中

通过剧本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 }}

Ansible学习笔记11:变量(用户定义)_变量_02

注意:当在字符串中使用变量插值时,通常需要用引号将变量插值部分包围起来,尤其是在变量插值出现在字符串的开始位置时。

异常示例

- hosts: web
  vars:
    file: /etc/hostname
  tasks:
    - name: print var
      debug:
        msg: {{ file }} 是变量的内容

Ansible学习笔记11:变量(用户定义)_变量_03


msg字段的值应该被双引号包围,并且{{ file }}变量插值也应该被双引号包围,以确保YAML解析器能够正确识别和处理

- hosts: web
  vars:
    file: /etc/hostname
  tasks:
    - name: print var
      debug:
        msg: "{{ file }} 是变量的内容"

Ansible学习笔记11:变量(用户定义)_Ansible_04

变量文件

直接定义一个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 }}

Ansible学习笔记11:变量(用户定义)_变量_05

根据主机清单自动识别变量 group_vars

在Ansible中,group_vars是用于存放与主机组相关的变量的目录。这些变量可以在playbook中通过{{ variable_name }}语法引用,以实现对不同主机组进行不同的配置。

以下是如何使用group_vars的步骤:

  1. 创建group_vars目录:首先,在Ansible的inventory文件所在的目录中创建一个名为group_vars的目录。
  2. 定义主机组变量:在group_vars目录中,为每个主机组创建一个YAML文件,文件名与主机组名相同。例如名为web的主机组,则在group_vars目录中创建一个名为web.yml的文件。
    web.yml文件中,你可以定义适用于该主机组的变量。例如:

web.yml

group: web

web_proxy.yml

group: web_proxy
  1. 加载group_vars:Ansible会自动加载group_vars目录中的变量文件,并在执行playbook时将其应用于相应的主机组。
  2. 在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目录。如果是使用ansibleansible-console命令行,则会去当前playbook所在文件统计目录下的inventory文件夹下去查找group_vars目录。

确保你的inventory文件正确加载了主机组,并且playbook中引用了正确的变量名。你可以使用Ansible的调试功能来验证变量是否被正确识别和应用。

Ansible学习笔记11:变量(用户定义)_Ansible_06

注意,也可以将各个分组的变量文件放到分组名的目录下。

上文即可修改为

group_vars/web/var.yml

group_vars/web_proxy/var.yml

Ansible学习笔记11:变量(用户定义)_变量_07

执行结果不变

Ansible学习笔记11:变量(用户定义)_Ansible_08

all

注意:如果有分组中有all,则设定为默认的。凡是没有匹配到的,使用all的变量配置。

验证:

移除web,添加all

group_vars/all/var.yml

group: all

Ansible学习笔记11:变量(用户定义)_Ansible_09

运行结果有变化

Ansible学习笔记11:变量(用户定义)_变量_10