在 Playbook 中,常用变量可以分为以下几类:

第一种、用户自定义变量

在 Playbook 中:
1)用户可以通过 vars 关键字自定义变量;
2)也可以使用 vars_files 关键字引入包含变量定义的文件;
3)在使用时用 {{ var_name }}

如下示例,在 Playbook 中定义并使用变量:



- hosts: web

  # 在 Playbook 中定义和使用变量
  vars:
    http_port: 80
    remote_user: root
    foo:
      state: enabled
      immediate: yes

  # 在配置文件中定义变量
  vars_files:
    - vars/server_vars.yml

  # 如果不需要使用系统变量,可以关闭远程变量的收集
  gather_facts: no

  tasks :
    - name: "使用用户定义的变量"
      firewalld: port="{{ http_port }}/tcp" permanent="true" state="{{ foo.state }}" immediate="{{ foo['immediate'] }}"
    - name : "直接使用系统变量的示例"
      shell : echo {{ ansible_os_family }}
    - name : "使用复杂的系统变量的示例"
      shell : echo {{ ansible_os_family }} {{ ansible_ens3["ipv4"]["address"] }} {{ ansible_ens3.ipv4.address }}



在如上示例中的 foo 是个复杂的变量,可以通过 foo.state、foo['immediate']

在使用 {{ var_name }} 引用变量时,如果以 { 作为参数开始,则需要需要加上双引号(通常为 "{{ var_name }}"

第二种、远程节点变量(Facts)

此类变量无须用户进行定义,而是 Ansible 在执行 Playbook 脚本之前,使用 setup 模块去全程主机上搜集关于远程节点系统信息的变量。

这些搜集到的系统信息叫作 Facts,这些信息可以已经变量的形式直接使用。使用 ansible all -m setup -u root

如果不需要 Facts 信息,可以通过关键字 gather_facts



--- - hosts: production gather_facts: no



第三种、注册变量

把动作的运行结果可以作为一个变量来使用,这个变量叫作“注册变量”。

把动作的运行结果当作变量使用:”注册变量“,把执行结果注册到变量中的关键字是register,使用方法如下:



---
- hosts: web
  tasks:
    - shell: ls
      register: result
      ignore_errors: True

    - shell: echo "{{ result.stdout }}"
      when: result.rc == 5

    - debug: msg="{{ result.stdout }}"



注册变量经常和 debug 模块一起使用,这样可以得到更多的关于执行错误的信息,以帮助用户调试。

第四种、额外变量(命令行传入)

为了使 Playbook 更灵活、通用性更强,允许用户在执行 Playbook 脚本时从命令行传入变量的值,这个时候就需要用到“额外变量”。

在执行 Playbook 脚本时,从命令行传入的变量。有以下若干方法:



#!/bin/sh

# 在命令行里面传值的方法
ansible-playbook e33_var_in_command.yml --extra-vars="hosts=web user=root"

# 还可以用 JSON 格式传递参数
ansible-playbook e33_var_in_command.yml --extra-vars="{'hosts':'vm-rhel7', 'user': 'root'}"

# 可以将参数放在文件里面
ansible-playbook e33_var_in_command.yml --extra-vars="@vars.json"



在模板中使用变量

在文件模板(使用template模块)中,可以直接使用上述两种变量。

在 template 模块中使用变量:
1)在 Playbook 中定义的变量,可以直接在 template 中使用;
2)同时 Facts 变量也可以直接在 template 中使用;
3)当然也包含在主机清单里面定义的 Host 和 Group 变量;