【Ansible 学习之旅】Ansible 中的变量

系列文章

Ansible 介绍和架构
Ansible 安装和入门
配置控制机器和受控机器
Inventory文件介绍
Ansible核心工具介绍
Ansible常用模块介绍与演示
Playbook 的基本概念
Playbook 的使用实例


目录


定义变量

在 Playbook 中定义

可以在 Playbook 的 Play 层次中定义变量,使用 vars 关键字:

yaml 复制代码
---
- name: Example Play
  hosts: all
  vars:
    app_name: myapp
    app_port: 8080
  tasks:
    - name: Print application details
      debug:
        msg: "Application Name: {{ app_name }}, Port: {{ app_port }}"
  • 在这个例子中,我们在 Play 层次定义了两个变量 app_name 和 app_port,并在任务中使用它们。
  • 通过{``{ variable_name }} 调用变量,且变量名前后建议加空格

在 Inventory 文件中定义

还可以在 Inventory 文件中定义变量:

yaml 复制代码
[webservers]
web01 ansible_host=192.168.1.101 ansible_user=root app_name=myapp app_port=8080
  • 这里,我们在 Inventory 文件中为 web01 主机定义了 app_name 和 app_port 变量。

通过命令行传递

以在执行 Playbook 时通过命令行参数传递变量:

bash 复制代码
ansible-playbook playbook.yml -e "app_name=myapp" -e "app_port=8080"
  • 这里,我们使用 -e 参数在命令行中传递了 app_name 和 app_port 变量。

变量的作用域

全局变量 (Global Scope)

全局变量是在命令行或 Ansible 配置文件中定义的变量,它们在整个 Playbook 执行过程中都可用。

bash 复制代码
ansible-playbook playbook.yml -e "app_name=myapp" -e "app_port=8080"

Play 变量 (Play Scope)

Play 变量是在 Play 层次中定义的变量,它们在整个 Play 的执行过程中都可用。

yaml 复制代码
---
- name: Example Play
  hosts: all
  vars:
    app_name: myapp
    app_port: 8080

主机变量 (Host Scope)

主机变量是在 Inventory 文件中为特定主机或主机组定义的变量。

Ini 复制代码
[webservers]
web01 ansible_host=192.168.1.101 ansible_user=root app_name=myapp app_port=8080

任务变量 (Task Scope)

任务变量是在特定任务中定义的变量,它们只在当前任务中可用。

yaml 复制代码
- name: Set a task variable
  set_fact:
    task_variable: "Value of task variable"

- name: Use the task variable
  debug:
    msg: "Task variable value: {{ task_variable }}"
  • set_fact: 这个模块用于在任务执行期间设置变量。
  • 在第二个任务中,我们使用了 debug 模块来输出一条消息,其中包含 task_variable 的值。这里我们使用了双大括号 {``{ }} 来引用 task_variable 变量。当 Ansible 解释这条指令时,它会替换双大括号中的变量值

Block 变量 (Block Scope)

Block 变量是在 block 结构中定义的变量,它们只在当前 block 内可用。

yaml 复制代码
- name: Define variables in a block
  block:
    - name: Set a block variable
      set_fact:
        block_variable: "Value of block variable"

    - name: Use the block variable
      debug:
        msg: "Block variable value: {{ block_variable }}"

内置变量 (System Variables)

Ansible 自带了一系列内置变量,用于提供关于目标主机的信息。

yaml 复制代码
- name: Display hostname
  debug:
    msg: "Hostname: {{ ansible_hostname }}"

使用变量

一旦定义了变量,你可以在 Playbook 的任务中使用双大括号 {``{ }} 来引用它们。

yaml 复制代码
- name: Print application details
  debug:
    msg: "Application Name: {{ app_name }}, Port: {{ app_port }}"

这里有一个综合示例,展示了如何在 Playbook 中使用不同作用域的变量:

yaml 复制代码
---
- name: Example Playbook
  hosts: webservers
  vars:
    app_name: myapp
    app_port: 8080
  vars_files:
    - vars/secrets.yml
  tasks:
    - name: Print application details
      debug:
        msg: "Application Name: {{ app_name }}, Port: {{ app_port }}, Secret: {{ secret_key }}"

    - name: Set a task variable
      set_fact:
        task_variable: "Value of task variable"

    - name: Use the task variable
      debug:
        msg: "Task variable value: {{ task_variable }}"

在这个例子中,我们定义了 Play 变量 app_name 和 app_port,使用了 vars_files 来包含外部变量文件 secrets.yml,并且在任务中设置了任务变量 task_variable 并使用它。


变量的优先级

如果在多个地方定义了同名的变量,那么 Ansible 会按照以下顺序确定最终使用的变量值:

  • 命令行变量 (-e 或 --extra-vars) >
  • Play 变量 (vars 在 Play 中定义) >
  • 角色变量 (vars 在 Role 中定义) >
  • 主机变量 (Inventory 文件中定义) >
  • 默认变量 (default 在 Play 或 Role 中定义)
相关推荐
月夕花晨37425 分钟前
C++学习笔记(30)
c++·笔记·学习
架构文摘JGWZ1 小时前
Kafka 消息丢失如何处理?
学习
我的运维人生2 小时前
利用Python与Ansible实现高效网络配置管理
网络·python·ansible·运维开发·技术共享
qlau20073 小时前
基于kolla-ansible在AnolisOS8.6上部署all-in-one模式OpenStack-Train
ansible·openstack
linly12194 小时前
python学习笔记目录
笔记·学习
LvManBa5 小时前
Vue学习记录之四(computed的用法)
前端·vue.js·学习
Li小李同学Li6 小时前
git学习【持续更新中。。。】
git·学习·elasticsearch
·云扬·6 小时前
Shiro框架
笔记·学习·java-ee