1. Ansible Variables

变量提供了便捷的方式来管理 ansible 项目中的动态值。 比如 nginx-1.12 ,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。这样可以简化项目的创建和维护。

变量名:仅能由字母、数字和下划线组成,且只能以字母开头。

1.1 变量定义的方式

Ansible 中定义变量分为如下三种方式:

    1. 通过ansible-playbook命令行传递变量参数定义;
    1. play文件中进行定义变量;
    • 2.1) 通过vars定义变量;
    • 2.2) 通过vars_files定义变量;
    1. 通过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文件,当前显示的就是优先级最高的,然后把优先级最高的变量删除,再依次向下测试。

  1. 最优先的为命令行传递的参数:

    [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"
    ]
    }
  2. 然后是在playbook中定义的vars_files变量:

    [root@xuzhichao ansible_var]# ansible-playbook test.yml 
    
    TASK [Print Vaiables] **************************************************************************************************************************
    ok: [192.168.20.23] => {
    "msg": [
    "vars_files"
    ]
    }
  3. 然后是在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"
    ]
    }
  4. 然后是在host_vars中定义的变量

    #删除playbook中的vars:行再进行测试:
    [root@xuzhichao ansible_var]# ansible-playbook test.yml TASK [Print Vaiables] *************************************************************************************************************************
    ok: [192.168.20.23] => {
    "msg": [
    "host_vars"
    ]
    }
  5. 然后是在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"
    ]
    }
  6. 然后是在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"
    ]
    }
  7. 然后是在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"
    ]
    }
  8. 然后是在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 变量优先级总结

变量的优先级从高到低依次为:

  1. 命令行传递的变量;
  2. playbook中定义的vars_files
  3. playbook中定义的vars
  4. host_vars中定义的变量;
  5. inventory中定义的主机变量;
  6. group_vars中定义的组变量:group_vars/group_name
  7. group_vars中定义的all文件中的变量:group_vars/all
  8. inventory中定义的主机组变量;

ansible系列(20)--ansible的变量详解的更多相关文章

  1. Ansible Facts 变量详解

    Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...

  2. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  3. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  4. 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解  更新时间:2017年10月27日 09:44:56   作者:铁锚   我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...

  5. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  6. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  7. 构建安全的Xml Web Service系列之wse之错误代码详解

    原文:构建安全的Xml Web Service系列之wse之错误代码详解 WSE3.0现在还没有中文版的可以下载,使用英文版的过程中,难免会遇到各种各样的错误,而面对一堆毫无头绪的错误异常,常常会感到 ...

  8. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  9. Maya 常用环境变量详解

    Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...

  10. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

随机推荐

  1. 自己写个网盘系列:③ 开源这个网盘编码,手把手教你windows linux 直接部署,docker本地打包部署网盘应用

    系列①②已经完成了这个项目的页面和项目的全部编码,前后端分离,这个文章将向你展示运维小伙伴如何部署到windows服务器,linux服务器,docker部署,一学就会,快来看看吧! 说明:这个系列准备 ...

  2. 强!10.6K star,一款开源HTTP测试工具,适合新手,简单、容易上手!

    大家好,我是狂师! 今天给大家推荐一款开源的HTTP测试工具:Hurl,相比curl.wget功能更强大,且更容易上手.很适用新手使用. 1.项目介绍 Hurl是一个使用Rust语言开发的命令行工具, ...

  3. #Multi-SG#HDU 5795 A Simple Nim

    题目 有\(n\)堆石子,每次可以从一堆中取出若干个或是将一堆分成三堆非空的石子, 取完最后一颗石子获胜,问先手是否必胜 分析 它的后继还包含了分成三堆非空石子的SG函数,找规律可以发现 \[SG[x ...

  4. #贪心#洛谷 3173 [HAOI2009]巧克力

    题目 分析 既然每一刀都要切,那肯定代价越大的要越早切, 考虑按代价降序排序,如果切了一行,求切列的时候贡献的行数就多了1. 代码 #include <cstdio> #include & ...

  5. #子序列自动机,vector#洛谷 3500 [POI2010]TES-Intelligence Test

    题目 多组询问查询某个串是否为模式串的子序列 分析 考虑用子序列自动机做,匹配的时候显然选择靠前的,用个vector查询最近的就行了 代码 #include <cstdio> #inclu ...

  6. 小师妹学JavaIO之:try with和它的底层原理

    目录 简介 IO关闭的问题 使用try with resource try with resource的原理 自定义resource 总结 简介 小师妹是个java初学者,最近正在学习使用java I ...

  7. ArkUI中的线程和看门狗机制

    一.前言 本文主要分析ArkUI中涉及的线程和看门狗机制. 二.ArkUI中的线程 应用Ability首次创建界面的流程大致如下: 说明: • AceContainer是一个容器类,由前端.任务执行器 ...

  8. RabbitMQ 07 发布订阅模式

    发布订阅模式 发布订阅模式结构图: 比如信用卡还款日临近了,那么就会给手机.邮箱发送消息,提示需要去还款了,但是手机短信和邮件发送并不一定是同一个业务提供的,但是现在又希望能够都去执行,就可以用到发布 ...

  9. Health Kit申请验证有问题?解决方案全解析

    在接入Health Kit的过程中,应用上线前需要完成申请验证环节,获得正式的运动健康权限. 我们贴心整理了申请验证被驳回的高频问题,您可以在申请前阅读以下内容,避免在您的申请材料中出现下述问题影响审 ...

  10. Qt调用动态库的三种方式(linux)

    本文章主要记录Qt在linux电脑上调用so库的三种调用方式 方式一:静态加载so库 方式二:动态加载so库(QLibrary) 方式三:动态加载so库(dlopen)   其他: 封装的so库叫做: ...