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

Ansible 变量指南:声明、优先级、作用域与最佳实践(一)

Ansible 变量的声明

前言

全面理解 Ansible 变量是编写高效、可维护 Playbook 的关键。由于最近使用 Ansible 比较多,在变量问题上踩了不少坑,也因此对变量的声明,优先级和作用域有了更深的理解。姑且总结一下,分享给大家,作为一个学习、避坑小指南。


在哪儿声明 Ansible 变量?

简单来说,变量可以放在下面这些地方,我们平时用得最多的也就这几种。加上代码示例后会更清晰。

  1. 命令行里直接加

    • -e--extra-vars 参数,在跑 playbook 的时候临时指定。

    ansible-playbook my_playbook.yml -e “user=admin http_port=8080”

    
    
  2. Playbook 文件里

    • vars::直接在 Playbook 里写。
    - name: My Playbookhosts: webserversvars:app_name: "AwesomeApp"app_version: "1.2.3"tasks:- name: Display app infodebug:msg: "Deploying {{ app_name }} version {{ app_version }}"
    
    • vars_files: 把变量单独存到一个文件里,然后在 Playbook 里引用。
    # vars/db.yml
    db_user: "mysql_user"
    db_pass: "secret"
    
    # playbook.yml
    - name: My Playbookhosts: db_serversvars_files:- vars/db.ymltasks:- name: Configure databasedebug:msg: "Configuring DB with user {{ db_user }}"
    
    • vars_prompt: 运行时会提示你手动输入,适合密码这类敏感信息。
    - name: Deploy with user confirmationhosts: allvars_prompt:- name: "deploy_user"prompt: "Enter your username for deployment"private: no # 输入时可见- name: "deploy_password"prompt: "Enter your password"private: yes # 输入时不可见tasks:- name: Run deploymentdebug:msg: "Running as {{ deploy_user }}"
    
  3. Inventory 清单里

    • group_vars/: 这是最常用的。给某个主机组(比如 webservers)创建一个 group_vars/webservers.yml 文件,里面的变量就对这个组所有机器生效。group_vars/all.yml 里的变量对所有机器都生效。
    # 目录结构
    inventory
    group_vars/webservers.ymlall.yml
    
    # group_vars/webservers.yml
    http_port: 80
    ntp_server: "ntp.web.example.com"
    
    • host_vars/: 如果只想给某一台机器(比如 server1.example.com)指定变量,就创建一个 host_vars/server1.example.com.yml 文件。
    # 目录结构
    inventory
    host_vars/server1.example.com.yml
    
    # host_vars/server1.example.com.yml
    # 这个配置会覆盖 group_vars/webservers.yml 里的 http_port
    http_port: 8080
    
  4. Role (角色) 里

    • roles/your_role/defaults/main.yml: 角色的默认变量。注意是“默认”,意思是它的优先级最低,很容易被其他地方的同名变量覆盖。
    # roles/my_apache_role/defaults/main.yml
    apache_port: 80
    
    • roles/your_role/vars/main.yml: 角色的“标准”变量,比 defaults 里的优先级高。
    # roles/my_apache_role/vars/main.yml
    apache_package_name: "httpd"
    
  5. 运行时动态生成

    • Facts (事实变量): Ansible 会自动收集远程机器的信息,比如 IP 地址 (ansible_default_ipv4.address)、系统版本等。这些是它自己发现的变量。
    - name: Show OSdebug:msg: "The OS is {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}"
    
    • register: 把一个任务的执行结果存成一个变量,给后面的任务用。
    - name: Check file existencecommand: ls /path/to/some/fileregister: file_check_resultignore_errors: yes- name: Report if file existsdebug:msg: "File exists!"when: file_check_result.rc == 0
    
    • set_fact: 在 playbook 运行过程中,手动创建一个新变量。
    - name: Set a custom factset_fact:my_custom_variable: "Hello World"- name: Use the custom factdebug:msg: "{{ my_custom_variable }}"
    

后续会再写一篇介绍 Ansible 变量的优先级和作用域。

参考资料

  • Ansible 官方文档:使用变量 (Using Variables)
http://www.dtcms.com/a/294317.html

相关文章:

  • Jquery、Vue 、Ajax、axios、Fetch区别
  • Ansible在配置管理中的应用
  • ffmpeg rtsp 丢包处理
  • SSH公钥认证连接过程
  • Linux 进程与服务管理~进程基础、进程查看、进程控制、服务管理、开机启动​​
  • 纯CPU场景下C++的分布式模型训练框架设计思路
  • 2025.7.20 文献阅读-基于深度神经网络的半变异函数在 高程数据普通克里格插值中的应用
  • go语言数据结构与排序算法
  • 【C++】C++ 的入门知识2
  • Android 持久化存储原理与使用解析
  • MATLAB | 绘图复刻(二十二)| 带树状图的三角热图合集
  • 个性化网页计数器
  • C 语言介绍
  • 【数据结构】二叉树的链式结构--用C语言实现
  • 嵌入式linux下的NES游戏显示效果优化方案:infoNES显示效果优化
  • 我用EV-21569-SOM评估来开发ADSP-21569(十三)-SigmaStudio Plus做开发(4)
  • Web前端开发:JavaScript遍历方法详解与对比
  • 安全防护-FCW
  • [HarmonyOS] HarmonyOS LiteOS-A 设备开发全流程指南
  • Linux第三天Linux基础命令(二)
  • 服务器对kaggle比赛的数据集下载
  • SAP-ABAP:SELECT语句验证字段和验证方法详解
  • OSPF路由协议——上
  • 28. 找出字符串中第一个匹配项的下标
  • vue3中el-table表头筛选
  • Flink 状态管理设计详解:StateBackend、State、RocksDB和Namespace
  • 谷粒商城篇章13--P340-P360--k8s/KubeSphere【高可用集群篇一】
  • 抖音集团基于Flink的亿级RPS实时计算优化实践
  • k8s pvc是否可绑定在多个pod上
  • 飞算JavaAI:从“工具革命”到“认知革命”——开发者如何借力AI重构技术竞争力