【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 中定义)
相关推荐
知识分享小能手10 分钟前
Ubuntu入门学习教程,从入门到精通,Linux操作系统概述(1)
linux·学习·ubuntu
yuhaiqun19891 小时前
Typora 技能进阶:从会写 Markdown 到玩转配置 + 插件高效学习笔记
经验分享·笔记·python·学习·学习方法·ai编程·markdown
我命由我123452 小时前
Python Flask 开发问题:ImportError: cannot import name ‘Markup‘ from ‘flask‘
开发语言·后端·python·学习·flask·学习方法·python3.11
全栈陈序员2 小时前
【Python】基础语法入门(二十)——项目实战:从零构建命令行 To-Do List 应用
开发语言·人工智能·python·学习
AA陈超2 小时前
枚举类 `ETriggerEvent`
开发语言·c++·笔记·学习·ue5
小六*^____^*2 小时前
虚拟列表学习
前端·javascript·学习
代码游侠2 小时前
学习笔记——IPC(进程间通信)
linux·运维·网络·笔记·学习·算法
charlie1145141913 小时前
如何把 Win32 窗口“置顶”(Windows + C++)
开发语言·c++·windows·笔记·学习·软件工程
名字不相符3 小时前
BUUCTF题目列表Misc题目(个人记录与学习)(第二页)
学习·misc·buuctf·萌新
点云SLAM3 小时前
Mitigation 英文单词学习
学习·英文单词学习·雅思备考·降低风险或影响·缓解、减轻·mitigation