Ansible 变量详解

在 Ansible 中,变量是用于存储和重用数据的关键组件。它们可以帮助简化任务定义,使 Playbook 更具可读性和灵活性。本文将详细介绍 Ansible 变量的命名规则、作用域、定义方法以及使用方式。

1. 变量命名规则

变量的名称必须遵循以下规则:

  • 必须以字母开头。
  • 只能包含字母、数字和下划线。
无效的变量名称有效的变量名称
web serverweb_server
remote.fileremote_file
1st filefile_1
remoteserver$1remote_server_1

例如,在 CentOS 上定义有效的变量名:

- name: 设置变量示例
  hosts: all
  vars:
    web_server: "nginx"
    db_server: "postgresql"

2. 变量的作用域

Ansible 中的变量可以定义在不同的范围内,每个范围的优先级不同。变量的范围包括:

  • 全局范围:从命令行或 Ansible 配置文件中设置的变量。
  • Play 范围:在 play 和相关结构中设置的变量。
  • 主机范围:由清单(inventory)、事实收集(facts)或注册的任务(register)定义的变量。

变量优先级:命令行 > play 范围 > 主机范围

3. Playbook 中定义变量

方法一:在 Playbook 开头的 vars 块中定义变量
- hosts: all
  vars:
    user: "alice"
    home: "/home/alice"
方法二:通过 vars_files 指令指定外部文件,在外部文件中定义变量

创建一个外部文件 users.yml

user: "bob"
home: "/home/bob"

在 Playbook 中引用外部文件:

- hosts: all
  vars_files:
    - vars/users.yml

4. Playbook 文件中使用变量

定义的变量可以在 Playbook 中使用双大括号 {{ }} 进行引用。Ansible 在任务执行时会将变量替换为相应的值。

- name: 安装并启动 Apache 服务
  hosts: web
  vars:
    web_pkg: "httpd"
    firewall_pkg: "firewalld"
    web_service: "httpd"
    firewall_service: "firewalld"
    rule: "http"
  tasks:
    - name: 安装软件包
      yum:
        name: "{{ web_pkg }}"
        state: latest

    - name: 启动并启用防火墙服务
      service:
        name: "{{ firewall_service }}"
        enabled: true
        state: started

    - name: 启动并启用 Web 服务
      service:
        name: "{{ web_service }}"
        enabled: true
        state: started

5. 数组变量定义

可以将变量定义为数组,以便更好地组织和管理数据。

定义数组变量
users:
  alice:
    first_name: "Alice"
    last_name: "Smith"
    home_dir: "/home/alice"
  bob:
    first_name: "Bob"
    last_name: "Johnson"
    home_dir: "/home/bob"
访问数组变量

可以使用以下方法访问用户数据:

# 返回 'Alice'
users.alice.first_name

# 返回 '/home/bob'
users.bob.home_dir

由于变量被定义为 Python 字典,可以使用替代语法:

# 返回 'Alice'
users['alice']['first_name']

# 返回 '/home/bob'
users['bob']['home_dir']

6. register 变量注册和使用

使用 register 注册变量

在任务中使用 register 关键字将命令的输出结果存储到一个变量中。

- name: 安装软件包并输出结果
  hosts: web
  tasks:
    - name: 安装 httpd 包
      yum:
        name: "httpd"
        state: present
      register: install_result

    - debug:
        var: install_result
运行结果

执行上述 Playbook 后,install_result 变量将包含有关软件包安装的详细信息。可以使用 debug 模块输出变量的内容以供检查和调试。

TASK [安装 httpd 包] *****************************************
ok: [192.168.31.81] => {
    "install_result": {
        "changed": false,
        "failed": false,
        "msg": "Nothing to do",
        "rc": 0,
        "results": []
    }
}

本文由mdnice多平台发布


逼格高的汤圆
7 声望2 粉丝