【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 中定义)
相关推荐
Nightwish57 分钟前
ansible操作随记(一)
ansible
-一杯为品-35 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
风尚云网1 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
EterNity_TiMe_3 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
sanguine__3 小时前
java学习-集合
学习
lxlyhwl3 小时前
【STK学习】part2-星座-目标可见性与覆盖性分析
学习
nbsaas-boot3 小时前
如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
学习·chatgpt·编辑器
CV学术叫叫兽4 小时前
一站式学习:害虫识别与分类图像分割
学习·分类·数据挖掘
我们的五年4 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
qq_383139844 小时前
ansible playbook安装nacos
ansible