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

Ansible变量的定义与使用

Ansible变量的定义与使用

在这里插入图片描述

变量定义规则

  • 由字母、数字、下划线组成,必须以字母开头
  • 不能使用Ansible内置关键字作为变量名
  • 变量引用格式:{{ 变量名 }}

变量范围与优先级(从高到低)

  1. Global范围:命令行和ansible配置设置的变量
  2. Play范围:在play和相关结构中设置的变量
  3. Host范围:inventory、facts或register的变量

优先级规则:高优先级变量会覆盖低优先级变量

变量定义与使用方式

1. vars定义变量

剧本文件:aa.yml

---
- name: testhosts: node1vars:   #定义变量- aa: 11- bb: 22- cc:a1: c31a2: c32tasks:- name: 输出变量aa  debug:msg: "{{ aa }}"- name: 输出变量bbdebug:msg: "{{ bb }}"- name: 输出变量cc的a1值debug:msg: "{{ cc.a1 }}"- name: 输出变量cc的a2值debug:msg: "{{ cc.a2 }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook aa.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出变量aa] *******************************************************************
ok: [node1] => {"msg": 11
}TASK [输出变量bb] *******************************************************************
ok: [node1] => {"msg": 22
}TASK [输出变量cc的a1值] *************************************************************
ok: [node1] => {"msg": "c31"
}TASK [输出变量cc的a2值] *************************************************************
ok: [node1] => {"msg": "c32"
}PLAY RECAP **************************************************************************
node1                      : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2. vars_files定义变量

变量文件 /home/student/ansible/var.yml

aa: 11
bb: 22
cc:a1: c31a2: c32

Playbook bb.yml

---
- name: testhosts: node1vars_files: /etc/ansible/var.ymltasks:- name: 输出变量aadebug:msg: "{{ aa }}"- name: 输出变量bbdebug:msg: "{{ bb }}"- name: 输出字典变量cc的a1值debug:msg: "{{ cc.a1 }}"- name: 输出字典变量cc的a2值debug:msg: "{{ cc.a2 }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook bb.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出变量aa] *******************************************************************
ok: [node1] => {"msg": 11
}TASK [输出变量bb] *******************************************************************
ok: [node1] => {"msg": 22
}TASK [输出变量cc的a1值] *************************************************************
ok: [node1] => {"msg": "c31"
}TASK [输出变量cc的a2值] *************************************************************
ok: [node1] => {"msg": "c32"
}PLAY RECAP **************************************************************************
node1                      : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3. register注册变量

剧本文件:cc.yml

---
- name: testhosts: node1tasks: - name: zz shell: "echo 123 > /tmp/zz"register: zz- name: 输出完整注册结果debug:var: zz

运行剧本文件

[student@master ansible]$ ansible-playbook cc.yml PLAY [test] *********************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [zz] ***************************************************************************
changed: [node1]TASK [输出完整注册结果] *************************************************************
ok: [node1] => {"zz": {"changed": true,"cmd": "echo 123 > /tmp/zz","delta": "0:00:00.005095","end": "2025-09-01 19:27:55.954175","failed": false,"msg": "","rc": 0,"start": "2025-09-01 19:27:55.949080","stderr": "","stderr_lines": [],"stdout": "","stdout_lines": []}
}PLAY RECAP **************************************************************************
node1                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

4. 事实变量(Facts)

剧本文件: dd.yml

---
- name: testhosts: node1tasks: - name: 输出主机名debug: msg: "主机名: {{ ansible_fqdn }}"- name: 输出IP地址debug:msg: "主机 {{ ansible_nodename }} 的IPv4地址是 {{ ansible_enp1s0.ipv4.address }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook dd.vim PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出主机名] *******************************************************************
ok: [node1] => {"msg": "主机名: node1.example.com"
}TASK [输出IP地址] *******************************************************************
ok: [node1] => {"msg": "主机 node1.example.com 的IPv4地址是 192.168.122.10"
}PLAY RECAP **************************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

常见的事实变量:

类别常用变量含义说明示例值
主机基本信息ansible_hostname目标主机的短主机名node1
ansible_fqdn目标主机的完全限定域名(FQDN)node1.example.com
ansible_system目标主机的操作系统类型Linux/Windows
操作系统信息ansible_os_family操作系统家族(简化分类)RedHat/Debian/Suse
ansible_distribution具体操作系统名称CentOS/Ubuntu/RedHat
ansible_distribution_version操作系统版本号9.2(RHEL 9.2)/22.04(Ubuntu)
硬件资源ansible_memtotal_mb总内存大小(MB)7824(约 8GB)
ansible_memfree_mb空闲内存大小(MB)5120
ansible_processor_coresCPU 核心数(单颗 CPU)4
ansible_processor_countCPU 物理颗数1
网络信息ansible_default_ipv4.address默认 IPv4 地址(路由优先的 IP)192.168.1.101
ansible_default_ipv4.gateway默认 IPv4 网关192.168.1.1
ansible_eth0.ipv4.address特定网卡(如 eth0)的 IPv4 地址(需根据实际网卡名调整)192.168.1.101
文件系统ansible_mounts所有挂载点信息(列表类型,含路径、文件系统类型、容量等)[{"mount": "/", "fstype": "xfs", ...}]
用户信息ansible_user_id执行 Ansible 任务的用户 IDroot/student

5. 命令行传递变量

Playbook (d.yml)

---
- name: testhosts: node1tasks:- name: 输出第一个变量debug:msg: "我的名字是 {{ name1 }}"- name: 输出第二个变量debug:msg: "我的名字是 {{ name2 }}"

执行命令:

ansible-playbook d.yml -e 'name1=tom name2=marry'

执行结果示例:

[student@master ansible]$ ansible-playbook d.yml -e 'name1=tom name2=marry'PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出第一个变量] ***************************************************************
ok: [node1] => {"msg": "我的名字是 tom"
}TASK [输出第二个变量] ***************************************************************
ok: [node1] => {"msg": "我的名字是 marry"
}PLAY RECAP **************************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

6. 主机清单中的变量

Inventory文件 (/home/student/ansible/hosts)

node1
node2
node3
node4
node5[test01]
node1
[test02]
node2
[web]
node3
node4
[test05]
node5
[webtest:children]
web
[test01:vars]
vars1='hello'
vars2='world'

Playbook (e.yml)

[student@master ansible]$ ansible-playbook e.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出变量vars1] ****************************************************************
ok: [node1] => {"msg": " hello"
}TASK [输出变量vars2] ****************************************************************
ok: [node1] => {"msg": " world"
}PLAY RECAP **************************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

运行剧本文件:

7. host_vars和group_vars目录定义变量

创建主机变量文件

[student@master ansible]$ mkdir host_vars
[student@master ansible]$ vim host_vars/node1

文件内容:

vars1: groupvars1
vars2: groupvars2

Playbook (f.yml)

---
- name: testhosts: node1tasks:- name: 输出变量vars1debug:msg: " {{ vars1 }}"- name: 输出变量vars2debug:msg: " {{ vars2 }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook f.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出变量vars1] ****************************************************************
ok: [node1] => {"msg": " groupvars1"
}TASK [输出变量vars2] ****************************************************************
ok: [node1] => {"msg": " groupvars2"
}PLAY RECAP **************************************************************************
node1                      : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

8. 内置变量

ansible_version变量(a.yml)
---
- name: testhosts: node1tasks:- name: 输出Ansible版本debug:msg: "{{ ansible_version }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook a.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出Ansible版本] **************************************************************
ok: [node1] => {"msg": {"full": "2.13.3","major": 2,"minor": 13,"revision": 3,"string": "2.13.3"}
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
inventory_hostname变量
---
- name: testhosts: node1tasks:- name: 输出主机名debug:msg: "{{ inventory_hostname }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook a.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出主机名] *******************************************************************
ok: [node1] => {"msg": "node1"
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
play_hosts变量
---
- name: testhosts: nettasks:- name: 输出目标主机列表debug:msg: "{{ play_hosts }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook a.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出目标主机列表] *************************************************************
ok: [node1] => {"msg": ["node1"]
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
groups变量
---
- name: testhosts: node1tasks:- name: 输出主机组信息debug:msg: "{{ groups }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook a.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出主机组信息] ***************************************************************
ok: [node1] => {"msg": {"all": ["node1","node2","node5","node3","node4"],"test01": ["node1"],"test02": ["node2"],"test05": ["node5"],"ungrouped": [],"web": ["node3","node4"],"webtest": ["node3","node4"]}
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
group_names变量
---
- name: testhosts: node1tasks:- name: 输出所属主机组debug:msg: "{{ group_names }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook a.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出所属主机组] ***************************************************************
ok: [node1] => {"msg": ["test01"]
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
inventory_dir变量
---
- name: testhosts: node1tasks:- name: 输出inventory目录debug:msg: "{{ inventory_dir }}"

运行剧本文件:

[student@master ansible]$ ansible-playbook a.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出inventory路径] ************************************************************
ok: [node1] => {"msg": "/home/student/ansible"
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

9. with_items迭代变量

---
- name: testhosts: node1tasks:- name: 循环输出字符串shell:cmd: echo "{{ item }}"with_items:- haha- heihei- heheregister: hi_var- name: 输出第一个结果debug:var: hi_var.results[0].stdout- name: 输出第二个结果debug:var: hi_var.results[1].stdout- name: 输出第三个结果debug:var: hi_var.results[2].stdout

运行剧本文件:

[student@master ansible]$ ansible-playbook w.yml PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [循环输出字符串] ***************************************************************
changed: [node1] => (item=haha)
changed: [node1] => (item=heihei)
changed: [node1] => (item=hehe)TASK [输出第一个结果] ***************************************************************
ok: [node1] => {"hi_var.results[0].stdout": "haha"
}TASK [输出第二个结果] ***************************************************************
ok: [node1] => {"hi_var.results[1].stdout": "heihei"
}TASK [输出第三个结果] ***************************************************************
ok: [node1] => {"hi_var.results[2].stdout": "hehe"
}PLAY RECAP **************************************************************************
node1                      : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Ansible Vault管理机密

创建加密文件

[student@master ansible]$ ansible-vault create vault.yml
New Vault password:    #建立密码
Confirm New Vault password: # 确认密码

直接查看加密文件无法获得正确内容:

[student@master ansible]$ cat vault.yml 
$ANSIBLE_VAULT;1.1;AES256
33636230323933313962393537376136376330613161663339363933373135636331326330366236
6463393531366136356337303832383062643530616564340a303532393966646339623337326366
30373162306362336139643565333461386636323164623037393066646466626337363938303963
6561386531366339630a623361323662323038623838383166363235373562333133353036636563
31623839373032636233663635356339656664666163666235653532396237336431353036666434
30353339316534663161653465316166386334623135326434356239363634363263646263396638
37383663623162653734363665303031363931333232646361323163363664306334336433373535
38376262633631326533656531313263313133613666623131663639333633623633613266326131
63333864326537343966663437333137333861396638396339353030386631623831373830353834
3033373932333636393334366361653365393234343139666238

查看加密文件

[student@master ansible]$ ansible-vault view vault.yml
Vault password:   #  输入密码
---
- name: testhosts: node1tasks:- name: 输出所属主机组debug:msg: "{{ group_names }}"

编辑加密文件

[student@master ansible]$ ansible-vault edit vault.yml
Vault password:   # 输入密码

加密现有文件

[student@master ansible]$ ansible-vault encrypt a.yml
New Vault password:    #建立密码
Confirm New Vault password:  # 确认密码
Encryption successful

解密文件

# 直接解密
ansible-vault[student@master ansible]$ ansible-vault decrypt a.yml
Vault password: 
Decryption successful
[student@master ansible]$ cat a.yml 
---
- name: testhosts: node1tasks: - name: 输出inventory路径debug:msg: "{{inventory_dir}}"decrypt test.yml# 解密为其他文件
ansible-vault decrypt a.yml --output=a-secret.yml

更改加密文件密码

[student@master ansible]$ ansible-vault rekey vault.yml
Vault password:  #输入原密码
New Vault password: #输入新密码
Confirm New Vault password: #确认新密码
Rekey successful

执行加密的Playbook

[student@master ansible]$ ansible-playbook --ask-vault-pass vault.yml
Vault password: PLAY [test] *************************************************************************TASK [Gathering Facts] **************************************************************
ok: [node1]TASK [输出所属主机组] ***************************************************************
ok: [node1] => {"msg": ["test01"]
}PLAY RECAP **************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
http://www.dtcms.com/a/361629.html

相关文章:

  • docker 网络配置
  • MJ Prompt Tool-好用的Midjourney提示词工具
  • uniApp 混合开发全指南:原生与跨端的协同方案
  • 机器学习通关秘籍|Day 05:过拟合和欠拟合、正则化、岭回归、拉索回归、逻辑回归、Kmeans聚类
  • ChatGLM-6B全流程部署:环境搭建→模型加载→API调用(附避坑指南)
  • 【项目思维】这是一份嵌入式软件开发的大纲(简化版)
  • Go 面试题: new 和 make 是什么,差异在哪?
  • window显示驱动开发—监视筛选器驱动程序
  • 如何安装CUDA????
  • 在 Qt 中加载 .qm 翻译文件
  • 基本问题解决--舵机
  • 选择图片转base64格式组件简单封装-Base64ImageInpu
  • nestjs 发起请求 axios
  • Onion-LO(已开源)——LIDAR里程计的统一框架
  • IO进程线程;标准io;文件IO;0901
  • PyTorch 实战(3)—— PyTorch vs. TensorFlow:深度学习框架的王者之争
  • 「日拱一码」075 机器学习——密度泛函理论DFT
  • 在 Unity 中调用腾讯云机器翻译
  • 命名空间级别应用 Pod 安全标准
  • 在 Ubuntu 24.04 LTS 上安装 SSH 并启用服务端实现远程连接
  • 别再刷屏console.log!JavaScript高级调试方法全攻略
  • Product Hunt 每日热榜 | 2025-08-30
  • C++“类吸血鬼幸存者”游戏制作的要点学习
  • IO_HW_9_1
  • 【零碎小知识点 】(二)Java基础与常用API编码实践
  • day2
  • 【STM32】中断软件分支处理( NVIC 和 GIC)
  • curl 介绍及使用教程
  • Kotlin 协程异步任务工具类:高效处理异步操作与超时控制
  • 构建共享新生态的智慧物流开源了