ansible playbook中的变量定义与引用
Ansible playbook中变量的定义与引用有很多种方法,这里在本地环境测试验证,并整理如下
测试环境:
使用自己的Mac笔记本上安装ansible作为控制服务器,VMware Fusion虚拟机上运行了一个Centos7的虚拟机(192.168.243.146)作为远程被控主机
测试用playbook如下:
cat test .yml --- - hosts: test remote_user: root tasks: - name: debug debug: msg= "The {{ inventory_hostname }} Value is {{ keyvalue }}" |
1 在Inventory文件中定义变量
将变量定义在inventory文件(默认为etc/ansible/hosts文件)中,如下定义一个名为keyvalue的变量:
--- # 针对单个主机定义变量 192.168.243.146 keyvalue=centos [ test ] 192.168.243.146 # 组定义变量 [ test :vars] keyvalue=vmware centos7 |
如上所示,有针对单个主机定义变量和组定义变量两种方式。
1)组定义变量的作用范围是组下的所有主机
2)当两种定义方式同时存在时,ansible会优先采用单个主机定义的变量值
2 通过host_vars和group_vars目录来定义变量
/etc/ansible/目录是linux系统上ansible默认的配置文件目录(Mac系统上的话,其默认配置目录是在/usr/local/etc/ansible/),在该目录下创建host_vars和group_vars两个目录用来存放定义变量的文件。如:
针对单个主机的变量
cat host_vars /192 .168.243.146 --- keyvalue: 192.168.243.146@host_vars |
针对test组的变量
cat group_vars /test --- keyvalue: test @group_vars |
同样,单个主机定义的变量优先级高于组定义的变量。经过实验,和1中介绍的变量定义方法相比,ansible使用变量的优先级顺序从高到低为:
host_vars下定义变量
inventory中单个主机定义变量
group_vars下定义变量
inventory中组定义变量
3 通过ansible-playbook命令行传入
在执行playbook命令时,通过-e选项传入参数:
ansible-playbook test .yml -e "keyvalue=inputed" |
此外,ansible-playbook还支持yaml和json文件的方式传入变量:
cat vars.yml --- keyvalue: vars@yaml |
cat vars.json { "keyvalue" : "vars@json" } |
这种方式传入的变量,比1和2中介绍的变量定义的优先级都要高。
4 在playbook的yaml文件中使用vars字段定义
cat test .yml --- - hosts: test remote_user: root vars: keyvalue: vars in playbook tasks: - name: debug debug: msg= "The {{ inventory_hostname }} Value is {{ keyvalue }}" |
通过vars字段,直接在playbook中定义变量。优先级高于1和2定义方法,低于3中命令行传入方法。
5 在playbook的yaml文件中使用vars_files字段定义
cat test .yml --- - hosts: test remote_user: root vars_files: - vars.yml tasks: - name: debug debug: msg= "The {{ inventory_hostname }} Value is {{ keyvalue }}" |
通过vars_files字段,直接在playbook中引入定义变量的文件,支持yaml和json两种文件格式的定义变量。优先级高于1和2定义方法,低于3中命令行传入方法。
6 使用register传递变量
register方式用于在task之间传递变量。
cat register.yml --- - hosts: test remote_user: root tasks: - name: register test shell: hostname register: info - name: display info debug: msg= "Hostname is {{ info }}" |
register定义的info变量在第二个task中用来查看前一个task中执行的hostname命令的结果。可以看到playbook运行后的结果中,info返回的是一段python字典数据,如果只想看到stdout部分的信息的话,可以通过info[‘stdout’]来引用。
cat register.yml --- - hosts: test remote_user: root tasks: - name: register test shell: hostname register: info - name: display info debug: msg= "Hostname is {{ info['stdout'] }}" |
7 使用vars_prompt交互式传入变量
在playbook中定义vars_prompt的变量名和交互式提示信息,就可以实现在运行playbook时,通过交互的传入变量值。
cat prompt.yml --- - hosts: test remote_user: root vars_prompt: - name: "var1" prompt: "input value for var1" private: no - name: "var2" prompt: "input value for var2" private: yes default: 'test var2' tasks: - name: display var1 debug: msg= "The value of var1 is {{ var1 }}" - name: display var2 debug: msg= "The value of var2 is {{ var2 }}" |
运行结果为:
private字段用来定义交互时是否回显输入的值,默认private为yes;default用来定义变量的默认值。
参考资料:
《Ansible自动化运维 技术与实践》4.2节
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2018-08-24 阿里云RDS实例内不同数据库之间的数据迁移