当前位置: 首页 > article >正文

Ansible中playbook的变量

变量

  • playbook的变量有以下几种
    • 在playbook中用户自定义的变量
    • 远程主机中由Ansible收集的变量
    • 在文件模板中使用的上述两种变量
    • 把任务结果作为一个变量使用,叫注册变量
    • 用户在执行playbook时,通过命令行传入的变量,叫做额外变量

在playbook中用户自定义的变量

playbook中定义变量

  • 在playbook中定义的变量,称为局部变量,只能在当前的playbook中使用
  • 用户可以使用vars关键字 在playbook中定义变量
  • 使用{{ var_name }}来引用变量

把变量放在单独的文件中

  • 可以把变量放在单独的文件中,然后在playbook中使用vars_files关键字引入变量文件
  • 变量文件的后缀名可以是.yml或者.yaml
  • 使用文件中变量的方法与 在playbook中定义变量的方法相同

定义和使用复杂变量

  • 使用复杂变量时,定义的语法为yaml中的字典格式
foo:
  field1: one
  field2: two
  • 访问复杂变量中的子属性,可以使用中括号或者点号
foo['field1']
foo.field2

yaml的陷阱

  • 变量引用时,如果提示语法错误,可以在引用变量的{}外加上""引号

远程主机系统变量(Facts)

  • Ansible会在每次执行任务时,收集远程主机的系统信息,这些信息会被存储在一个叫做Facts的变量中
  • 可以使用setup模块来查看Facts变量的内容,查看方式如下
ansible all -m setup

使用Facts变量

  • 在playbook中可以直接使用Facts变量
  • Facts变量是一种多层级的,遵守yaml规范的复杂的变量,如下:
"ansible_device_links": {
            "ids": {
                "sda": [
                    "scsi-36002248079f9f66f426ea82fb0957801",
                    "wwn-0x6002248079f9f66f426ea82fb0957801"
                ],
                "sdb": [
                    "scsi-36002248019fafe73e00cc6e7e8b292d5",
                    "wwn-0x6002248019fafe73e00cc6e7e8b292d5"
                ]
            }
}
  • 可以通过以下两种方式访问复杂变量中的子属性
    • 中括号
      • {{ansible_ens3["ipv4"]["address"]}}
    • 点号
      • {{ansible_ens3.ipv4.address}}

关闭Facts变量

  • 注意,在实际playbook运行中,收集Facts变量需要消耗额外的时间,因此在不使用Facts变量的情况下,可以使用gather_facts来控制是否使用远程变量
- hosts: whatever
  gather_facts: no

文件模板中使用的变量

template中变量的定义

  • 在playbook中定义的变量
  • Facts变量
  • inventory中定义的host和group变量

template中变量的使用

  • 使用Jinja2语言书写模板文件
  • 需要了解{{}}用来引用变量即可

注册变量

  • 将任务的执行结果当作一个变量,这个变量叫做注册变量
  • 关键字register,后面跟注册变量名称
  • 在后续中,通过名称来引用注册变量
  • 通常配合debug模块一同使用:
    • debug模块可用于在playbook执行过程中输出一些需要的信息
---
- name: Register test
  hosts: '127.0.0.1'
  tasks:
    - name: Register test
      ansible.builtin.shell: ls
      register: aaa
      ignore_errors: true

    - shell: echo "{{aaa.stdout_lines}}" > /tmp/reg.log
    - debug: msg="{{aaa.stdout_lines}}"

命令行传递参数

  • 用户在执行时传入变量的值:“额外变量”或者叫“命令行变量”

定义命令行变量

  • 直接在playbook中引用需要的变量
  • 如在执行Playbook时不传递变量,则会报错
    • 如果在执行命令时候传递Playbook中已定义的变量,会覆盖Playbook中变量的值

使用命令行变量

  • 直接传递
    • ansible-playbook test.yml --extra-vars "host=web"
  • JSON格式参数传递
    • ansible-playbook test.yml --extra-vars "{'host':'web'}"
  • 将变量参数放在文件中
    • ansible-playbook test.yml --extra-vars "@vars.json"

http://www.kler.cn/a/542424.html

相关文章:

  • vue-点击生成动态值,动态渲染回显输入框
  • docker.service job docker.service/start failed with result ‘dependency‘
  • 【Elasticsearch】监控与管理:集群监控指标
  • 分布式服务框架 如何设计一个更合理的协议
  • SpringBoot 统一功能处理之拦截器、数据返回格式、异常处理
  • 采用分步式无线控制架构实现水池液位自动化管理
  • DeepSeek与蓝耘智算平台:人工智能与高效算力的协同革命
  • 使用verilog 实现cordic 算法 ---- 向量模式
  • FAST_LIVO2初次安装编译
  • STM32 HAL库 SPI通讯(C语言)
  • 阿里云百炼初探DeepSeek模型调用
  • 【Pytorch实战教程】深入了解 PyTorch 中的 SummaryWriter
  • ES 索引结构
  • 32单片机学习记录0之前导
  • ubuntu部署postgresql+timescaladb时序数据库
  • 深度学习|表示学习|Instance Normalization 全面总结|26
  • 互联网大厂面试高频题-操作系统部分
  • Node.js开发属于自己的npm包(发布到npm官网)
  • deepseek+kimi一键生成PPT
  • 爬取豆瓣电影 Top250 数据的脚本及调整方法
  • 怎么保证设计的API是安全的
  • 车载DoIP框架 --- 怎么样给 tester 定义特定 TCP 源端口
  • DeepSeek与ChatGPT正在改写学历规则?2025教育革命深度解析
  • 接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成
  • react项目引入tailwindcss不生效解决方案
  • 2.11-背包问题