【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 中定义)
相关推荐
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__2 小时前
Web APIs学习 (操作DOM BOM)
学习
数据的世界014 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐4 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
OopspoO6 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A7 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒7 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
kkflash37 小时前
提升专业素养的实用指南
学习·职场和发展
1 9 J8 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
6.949 小时前
Scala——身份证号码查询籍贯
学习·scala