ansible系列(20)--ansible的变量详解
1. Ansible Variables
变量提供了便捷的方式来管理 ansible
项目中的动态值。 比如 nginx-1.12
,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。这样可以简化项目的创建和维护。
变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
1.1 变量定义的方式
在 Ansible
中定义变量分为如下三种方式:
- 通过
ansible-playbook
命令行传递变量参数定义;
- 通过
- 在
play
文件中进行定义变量;
- 2.1) 通过
vars
定义变量; - 2.2) 通过
vars_files
定义变量;
- 在
- 通过
inventory
在主机组或单个主机中设置变量;
- 3.1) 通过
host_vars
对主机进行定义; - 3.2) 通过
group_vars
对主机组进行定义; - 3.3) 通过inventory-hosts主机清单文件中定义变量;
- 通过
1.2 在playbook中定义变量
1.2.1 使用vars方式定义变量
在 playbook
的文件中开头通过 vars
关键字进行变量定义,格式如下:
vars:
- var1: value1
- var2: value2
使用示例如下,定义变量,使用debug
模块打印变量:
[root@xuzhichao ansible_var]# cat test1.yml
---
- hosts: 192.168.20.23
remote_user: root
vars:
- web_packages: httpd
- ftp_packages: vsftpd
tasks:
- name: Print Vaiables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
执行结果,打印变量的值:
[root@xuzhichao ansible_var]# ansible-playbook test1.yml
PLAY [192.168.20.23] *****************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23]
TASK [Print Vaiables] ****************************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"httpd", <==变量的内容
"vsftpd" <==变量的内容
]
}
PLAY RECAP ***************************************************************************************************************************************************
192.168.20.23 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.2.2 使用vars_file方式定义变量
在 playbook
中使用 vars_files
指定文件作为变量文件,好处就是其他的playbook
也可以调用。
使用示例如下:
编写一个
vars_files
文件,专门用于存放变量:[root@xuzhichao ansible_var]# cat vars.yml
web_packages: httpd
ftp_packages: vsftpd
编写
playbook
文件,调用变量文件:[root@xuzhichao ansible_var]# cat test2.yml
---
- hosts: 192.168.20.23
remote_user: root
vars_files: ./vars.yml tasks:
- name: Print Vaiables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
执行结果,打印变量的值:
[root@xuzhichao ansible_var]# ansible-playbook test2.yml PLAY [192.168.20.23] ***************************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23] TASK [Print Vaiables] ****************************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"httpd",
"vsftpd"
]
} PLAY RECAP ***************************************************************************************************************************************************
192.168.20.23 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.3 针对每个主机定义变量
1.3.1 Inventory文件中定义变量
示例一:分别为每个主机设置不同的主机名:
在
Inventory
文件中为每个主机定义变量:[root@xuzhichao ansible_var]# cat /etc/ansible/hosts
[NginxWebs]
192.168.20.22 hostname=nginx02
192.168.20.23 hostname=nginx03
编写
playbook
,修改主机名:[root@xuzhichao ansible_var]# cat test3.yml
---
- hosts: NginxWebs
remote_user: root tasks:
- name: Set Hostname
hostname:
name: "{{ hostname }}" [root@xuzhichao ansible_var]# ansible-playbook test3.yml
示例二:设置组公共变量:
编写
hosts
文件中的变量:[root@xuzhichao ansible_var]# cat /etc/ansible/hosts
[NginxWebs]
192.168.20.22 myid=1 state=master
192.168.20.23 myid=2 state=slave [NginxWebs:vars]
port=80
编写
playbook
文件:[root@xuzhichao ansible_var]# cat test4.yml
---
- hosts: NginxWebs
remote_user: root tasks:
- name: Print Vaiables
debug:
msg:
- "{{ myid }}-{{ state }}-{{ port }}"
运行
playbook
文件:[root@xuzhichao ansible_var]# ansible-playbook test4.yml PLAY [NginxWebs] ********************************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.22]
ok: [192.168.20.23] TASK [Print Vaiables] ****************************************************************************************************************************************
ok: [192.168.20.22] => {
"msg": [
"1-master-80" <==显示的内容
]
}
ok: [192.168.20.23] => {
"msg": [
"2-slave-80" <==显示的内容
]
} PLAY RECAP ***************************************************************************************************************************************************
192.168.20.22 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.3.2 使用host_vars定义变量
注意:在host_vars
目录中定义的变量,只能给对应的主机使用,没有定义变量的主机不能使用此处的变量。
在项目目录中创建
host_vars
目录,然后在创建一个文件,文件的文件名称要与inventory
清单中的主机名称要保持完全一致,如果是ip
地址,则创建相同ip
地址的文件即可:[root@xuzhichao ansible_var]# cat /etc/ansible/hosts
[NginxWebs]
192.168.20.22
192.168.20.23 [root@xuzhichao ansible_var]# mkdir host_vars
[root@xuzhichao ansible_var]# cd host_vars/ [root@xuzhichao host_vars]# cat 192.168.20.22
web_packages: httpd
ftp_packages: vsftpd [root@xuzhichao host_vars]# cat 192.168.20.23
web_packages: nginx
ftp_packages: tftp
编写
palybook
文件:[root@xuzhichao host_vars]# cat ../test5.yml
---
- hosts: NginxWebs
remote_user: root tasks:
- name: Print Vaiables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
运行
playbook
文件:[root@xuzhichao ansible_var]# ansible-playbook test5.yml PLAY [NginxWebs] ********************************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23]
ok: [192.168.20.22] TASK [Print Vaiables] ****************************************************************************************************************************************
ok: [192.168.20.22] => {
"msg": [
"httpd",
"vsftpd"
]
}
ok: [192.168.20.23] => {
"msg": [
"nginx",
"tftp"
]
} PLAY RECAP ***************************************************************************************************************************************************
192.168.20.22 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.3.3 使用group_vars定义变量
在项目目录中创建
group_vars
目录,然后在创建一个文件,文件的文件名称要与inventory
清单中的组名称保持完全一致;[root@xuzhichao ansible_var]# cat /etc/ansible/hosts
[NginxWebs]
192.168.20.22
192.168.20.23 [root@xuzhichao ansible_var]# mkdir group_vars
[root@xuzhichao ansible_var]# cd group_vars [root@xuzhichao group_vars]# cat NginxWebs
port: 80
编写
palybook
文件:[root@xuzhichao ansible_var]# cat test6.yml
---
- hosts: NginxWebs
remote_user: root tasks:
- name: Print Vaiables
debug:
msg:
- "{{ port }}"
运行
playbook
文件:[root@xuzhichao ansible_var]# ansible-playbook test6.yml PLAY [NginxWebs] ********************************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23]
ok: [192.168.20.22] TASK [Print Vaiables] ****************************************************************************************************************************************
ok: [192.168.20.22] => {
"msg": [
80
]
}
ok: [192.168.20.23] => {
"msg": [
80
]
} PLAY RECAP ***************************************************************************************************************************************************
192.168.20.22 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注意:在group_vars
目录中定义的组文件,只能改组中的主机使用,不是该组的主机无法使用此处定义的变量。
在系统中提供了一个特殊的 all
组,也就说在 group_vars
目录下创建一个 all
文件,定义变量对所有的主机组都生效;
[root@xuzhichao ansible_var]# cd group_vars/
[root@xuzhichao group_vars]# cat all
port: 80
1.4 通过执行Playbook传递变量
在执行Playbook
时,可以通过命令行 --extra-vars
或 -e
外置传参设定变量;
playbook
文件如下:[root@xuzhichao ansible_var]# cat test5.yml
---
- hosts: NginxWebs
remote_user: root tasks:
- name: Print Vaiables
debug:
msg:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
执行 playbook 时进行变量的传递:
[root@xuzhichao ansible_var]# ansible-playbook -e "web_packages=tomcat" -e "ftp_packages=sftp" test5.yml PLAY [NginxWebs] ********************************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.20.23]
ok: [192.168.20.22] TASK [Print Vaiables] ****************************************************************************************************************************************
ok: [192.168.20.22] => {
"msg": [
"tomcat",
"sftp"
]
}
ok: [192.168.20.23] => {
"msg": [
"tomcat",
"sftp"
]
} PLAY RECAP ***************************************************************************************************************************************************
192.168.20.22 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.20.23 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.5 变量定义的优先级
1.5.1 编写测试环境
定义相同的变量不同的值,来测试变量的优先级。操作步骤如下:
在
plabook
中定义vars
变量:[root@xuzhichao ansible_var]# cat test.yml
---
- hosts: 192.168.20.23
remote_user: root vars:
- test_var: "playbook var" vars_files: ./vars.yml tasks:
- name: Print Vaiables
debug:
msg:
- "{{ test_var }}"
在
playbook
中定义vars_files
变量:[root@xuzhichao ansible_var]# cat vars.yml
test_var: vars_files
在
host_vars
中定义变量:[root@xuzhichao ansible_var]# cat host_vars/192.168.20.23
test_var: host_vars
在
group_vars
中定义变量:[root@xuzhichao ansible_var]# cat group_vars/NginxWebs
test_var: groups_vars
在
group_vars
目录中的all文件中定义变量:[root@xuzhichao ansible_var]# cat group_vars/all
test_var: all_file_var
在
inventory
中定义主机变量和主机组变量:[root@xuzhichao ansible_var]# cat /etc/ansible/hosts
[NginxWebs]
192.168.20.22 test_var=inventory_host_var
192.168.20.23 test_var=inventory_host_var [NginxWebs:vars]
test_var=inventory_group_var
通过执行命令传递变量:
ansible-playbook -e "test_var=ansible-playbook_var" test.yml
1.5.2 测试变量的优先级
测试思路:运行playbook
文件,当前显示的就是优先级最高的,然后把优先级最高的变量删除,再依次向下测试。
最优先的为命令行传递的参数:
[root@xuzhichao ansible_var]# ansible-playbook -e "test_var=ansible-playbook_var" test.yml TASK [Print Vaiables] **************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"ansible-playbook_var"
]
}
然后是在
playbook
中定义的vars_files
变量:[root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] **************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"vars_files"
]
}
然后是在
plabook
中定义的vars
变量:#删除playbook中的vars_files: ./vars.yml行再进行测试:
[root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] **************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"playbook var"
]
}
然后是在
host_vars
中定义的变量#删除playbook中的vars:行再进行测试:
[root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] *************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"host_vars"
]
}
然后是在
inventory
中定义的主机变量:#删除host_vars/192.168.20.23文件,再进行测试:
root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] *************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"inventory_host_var"
]
}
然后是在
group_vars
中定义的组变量:#删除/etc/ansible/hosts中192.168.20.23的主机变量,再进行测试:
[root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] *************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"groups_vars"
]
}
然后是在
group_vars
中定义的all文件中的变量:#删除group_vars/NginxWebs文件,再进行测试:
[root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] *************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"all_file_var"
]
}
然后是在
inventory
中定义的主机组变量:#删除group_vars/all文件,再进行测试:
[root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] *************************************************************************************************************************
ok: [192.168.20.23] => {
"msg": [
"inventory_group_var"
]
}
1.5.3 变量优先级总结
变量的优先级从高到低依次为:
- 命令行传递的变量;
playbook
中定义的vars_files
;playbook
中定义的vars
;- 在
host_vars
中定义的变量; - 在
inventory
中定义的主机变量; - 在
group_vars
中定义的组变量:group_vars/group_name
; - 在
group_vars
中定义的all文件中的变量:group_vars/all
; - 在
inventory
中定义的主机组变量;
ansible系列(20)--ansible的变量详解的更多相关文章
- Ansible Facts 变量详解
Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...
- mysql show variables系统变量详解
mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- 如何查找YUM安装的JAVA_HOME环境变量详解
如何查找YUM安装的JAVA_HOME环境变量详解 更新时间:2017年10月27日 09:44:56 作者:铁锚 我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...
- Android Studio系列教程五--Gradle命令详解与导入第三方包
Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...
- 构建安全的Xml Web Service系列之wse之错误代码详解
原文:构建安全的Xml Web Service系列之wse之错误代码详解 WSE3.0现在还没有中文版的可以下载,使用英文版的过程中,难免会遇到各种各样的错误,而面对一堆毫无头绪的错误异常,常常会感到 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...
- Maya 常用环境变量详解
Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
随机推荐
- IDEA彩虹括号插件Rainbow Brackets
IDEA搜索插件Rainbow Brackets 安装后重启IDEA 效果如图:不同层级的括号会变成不同的颜色,便于区分. 光标定位到前一个括号后,使用快捷键ALT+鼠标右键可以只查看当前括号中的内容 ...
- 2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和,换言之你
2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和,换言之你 ...
- 开发人员使用HANA交付业务的学习路径
本文于2019年7月22日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 入门 编程规范. 开发环境使用方法. 基本语法,与其它同类软件的 ...
- 一文读懂java中的Reference和引用类型
目录 简介 强引用Strong Reference 软引用Soft Reference 弱引用weak Reference 虚引用PhantomReference Reference和Referenc ...
- 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场
针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...
- Top 20 OpenSSH Server Best Security Practices
Top 20 OpenSSH Server Best Security Practices by NIX Craft on July 24, 2009 · 139 comments· LAST UPD ...
- mysql 必知必会整理—sql 排序与过滤[三]
前言 简单整理一下MySQL的排序与过滤. 正文 我们查询出来的结果有时候是希望进行排序的,比如说: select product_name from products order by prod_n ...
- 重学c#系列——索引器(十)
前言 对于索引器,我们肯定不会陌生.为什么会有索引器这个东西呢?我们发现这东西很像是属性,只是通过索引方式去调用,那就慢慢揭开他的面纱吧. 正文 假设我们要对外暴露一个数组,为了体现其封装性,我们使用 ...
- Error:A problem occurred configuring project ':app'.
前言 因为部门需要用到另外一个部门的库,而另外一个部门是c++部门,这种声音视频算法java做不了的. 如果是因为有引入c++库产生的这个问题,那么基本上你需要肯定你安装了ndk,如果没有安装那么会报 ...
- Mui 消息推送
一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() {plus.navigator.closeSplashscreen(); ...