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

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.xdnf.cn/news/19511.html

相关文章:

  • 安卓11 12系统修改定制化_____常用的几种修改固件 实现指定 “运行内存” 显示
  • 【lucene】 中的impactsenum与impactsdisi有啥区别?
  • 拥抱智能高效翻译 ——8 款视频翻译工具深度测评
  • (附源码)留言系统的设计与实现
  • 标定分享3--lidar与rtk/ins标定外参工程实现分享
  • 变频器实习总结14 电子元件中的内部参考电压 Type-c口对于BMS开发的优点
  • Synchronized 概述
  • 平衡二叉树(一)
  • 2016考研数学(二)真题
  • sunset: noontide靶场
  • AlphaFold 2 本地部署与安装教程(Linux)
  • 高速CANFD通讯接口芯片ASM1042性能分析与5Mbps多节点测验
  • 包的相对导入
  • MPI-NCCL-TEST 训练自检,基础通信和可用的机器
  • 《Bishop PRML》10.1 (3) 理解VAE KL loss
  • 【贪心算法】day5
  • PPO、DPO和GRPO的区别
  • Python实现BP神经网络
  • 利用美团longcat.ai编写的C语言支持指定压缩算法通用ZIP压缩程序
  • 硬件工程师成长之路:从入门到精通的技术旅程
  • 科学研究系统性思维的方法体系:研究设计相关模版
  • go 开发环境配置 air + dlv debug 踩坑之旅
  • Linux shell 脚本基础 003
  • C6.7:输入电阻的负载效应及其CE负反馈放大器
  • android-studio 安装
  • Mysql中事务隔离级别有哪些?
  • Java实习:MySQL篇(黑马JavaWeb课程)
  • 简单的加密算法
  • PostgreSQL表膨胀的危害与解决方案
  • 人工神经网络(ANN)深度学习