【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 中定义)
相关推荐
Icoolkj42 分钟前
微服务学习-SkyWalking 实时追踪服务链路
学习·微服务·skywalking
李匠20241 小时前
云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持
学习·架构·云计算
dal118网工任子仪1 小时前
73,【5】BUUCTF WEB [网鼎杯 2020 玄武组]SSRFMe(未解出)
笔记·学习
如果'\'真能转义说2 小时前
TypeScript - 利用GPT辅助学习
gpt·学习·typescript
五味香4 小时前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
小爬菜4 小时前
Django学习笔记(启动项目)-03
前端·笔记·python·学习·django
小爬菜4 小时前
Django学习笔记(bootstrap的运用)-04
笔记·学习·django
阿无@_@4 小时前
1、ceph的安装——方式一ceph-ansible
ceph·ansible
牙牙7054 小时前
ansible一键安装nginx二进制版本
服务器·nginx·ansible
hhzz4 小时前
ansible自动化运维实战--复制模块和用户模块(3)
运维·自动化·ansible