Ansible变量
定义变量规则:由字母/数字/下划线组成,变量需要以字母开头,ansible内置的关键字不能作为变量。
ansible中,可以将变量简化为三个范围:
Global范围(高):从命令行和ansible配置设置的变量。
play范围(中):set_facts,register,在play和相关结构中设置的变量。
Host范围(低):inventory的变量,在主机组和个别主机上设置的变量。
-e > set_facts > register > vars(vars_files) > 事实变量 > inventory
内置变量不参与排序
三个范围的变量优先级由高到低,如果变量重复定义,则以优先级高的为准。
注册和定义变量的各种方式
ansible中定义变量的方式有很多种,大致有:
将模块的执行结果注册为变量
直接定义字典类型的变量
role中文件内定义变量
命令行传递变量
借助with_items迭代将多个task的结果赋值给一个变量
inventory中的主机或主机组变量
内置变量
事实变量
vars定义变量
# eg---- name: testhosts: node1vars:- aa: 11- bb: 22- cc:cc1: 33cc2: 44tasks:- name: create debug1debug:msg: aa is {{ aa }}- name: debug2debug:var: bb- name: debug3debug:msg: cc1 is {{ cc.cc1 }}- name: debug4debug: var: cc.cc2
Vars_files定义变量
vim var.yml
aa: 11bb: 22cc:cc1: 33cc2: 44
# eg---- name: testhosts: node1vars_files: /home/student/ansible/var.ymltasks:- name: create debug1debug:msg: aa is {{ aa }}- name: debug2debug:var: bb- name: debug3debug:msg: cc1 is {{ cc.cc1 }}- name: debug4debug: var: cc.cc2
register注册变量
使用register选项,可以将当前task的输出结果赋值给一个变量。
---- name: testhosts: node1tasks:- name: touchcopy:content: "hello world\n"dest: /tmp/aa- name: cat /tmp/aashell:cmd: cat /tmp/aaregister: i- name: debug idebug:var: i
# 得到变量i的结果为"i": {"changed": true,"cmd": "cat /tmp/aa","delta": "0:00:00.004095","end": "2025-09-01 16:07:27.999086","failed": false,"msg": "","rc": 0,"start": "2025-09-01 16:07:27.994991","stderr": "","stderr_lines": [],"stdout": "hello world","stdout_lines": ["hello world"]}}
当剧本运行错误时,变量仍然会被注册
# 查看/tmp/bb文件,将查看结果赋值给变量i,/tmp/bb文件不存在---- name: testhosts: node1tasks:- name: cat /tmp/bbignore_errors: yesshell:cmd: cat /tmp/bbregister: i- name: debug idebug:var: i
"i": {"changed": true,"cmd": "cat /tmp/bb","delta": "0:00:00.003762","end": "2025-09-01 16:16:04.346693","failed": true,"msg": "non-zero return code","rc": 1,"start": "2025-09-01 16:16:04.342931","stderr": "cat: /tmp/bb: No such file or directory","stderr_lines": ["cat: /tmp/bb: No such file or directory"],"stdout": "","stdout_lines": []}}
set_fact定义变量
set_fact与register的功能很相似,也是将值赋值给变量。它更像shell中变量的赋值方式,可以将某个变量的值赋值给另一个变量,也可以将字符串赋值给变量。
# 查看node1主机的所有事实变量 ansible node1 -m setup # ansible node1 -m setup > file 将结果保存在一个文件中方便查找
常用事实变量
# ipv4地址 ansible_default_ipv4.address # 或者 ansible_enp1s0.ipv4.address enp1s0是受控主机的网卡名称# 完全合格域名(FQDN) ansible_fqdn# 主机名称 ansible_hostname# 内存大小 ansible_memtotal_mb# bios版本 ansible_bios_version# vda硬盘大小 ansible_devices.vda.size# 逻辑卷中卷组 ansible_lvm.vgs
通过命令传入变量
ansible-playbook 剧本名称 -e 传入的变量及其值
--- - name: testhosts: node1tasks:- name: debug1debug:var: xingming- name: debug2debug:var: age
[student@master ansible]$ ansible-playbook a.yml -e 'xingming=ldh age=23'
主机清单中的变量
# 直接在主机后面定义,只有该主机可以调用该变量 node1 a=6# 将变量写入组里,该组的成员可以调用这些变量 [web:vars] a=1 b=2
除了可以在主机清单里定义变量外,还可以在/home/student/ansible目录下创建host_vars和host_vars目录下定义。
# host_vars中定义有两种,以node1举例 vim node1 # 这里node1是与主机清单inventory写的保持一致,如果主机清单写的是IP地址,这里也写IP地址 a: 11# 或者 vim node1.yml a: 22 # node1的优先级大于node1.yml的优先级
内置变量
groups # 主机清单中的分组情况 groups_names # 显示主机的主机组的名称 groups.all # 所有清单主机 inventroy_dir # 主机清单inventory的路径 inventory_hostname # 显示主机清单主机名称
with_items叠加变量
可以给一个变量赋予多个值
--- - name: testhosts: node1tasks: - name: echo itemshell:cmd: echo "{{ item }}"with_items:- a- b- cregister: i- name: echo adebug:var: i.results[0].stdout- name: echo bdebug:var: i.results[1].stdout- name: echo cdebug:var: i.results[2].stdout
管理机密
Ansible可能需要访问密码或者API密钥等敏感数据,以便配置受控主机。通常,此信息可能以纯文本形式存储在清单变量或其他ansible文件中。但若如此,任何有权访问ansible文件的用户或者存储这些ansible文件的版本控制系统都能够访问此数据敏感数据。这显然存在安全风险。
使用ansible随附的ansible vault可以加密和解密任何由ansible使用的结果化数据文件。若要使用ansible vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密和查看文件。Ansible vault可以加密任何由ansible使用的结构化数据文件。这可能包括清单变量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者ansible角色中定义的变量。
ansible-vault --helpansible-vault create # 创建新的加密文件 ansible-vault encrypt # 对已有文件进行加密 ansible-vault decrypt # 解密加密文件,直接解密。加入 --output=新的名称,解密文件并存放为其他名称。此时新文件为解密状态,原文件仍为加密状态 ansible-vault view # 查看加密文件内容 ansible-vault edit # 编辑加密文件 ansible-vault rekey # 修改加密文件的密码
加密过的文件无法使用cat查看、vim编辑以及ansible-playbook运行。
# 运行加密文件 ansible-playbook --ask-vault-pass