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. IDEA彩虹括号插件Rainbow Brackets

    IDEA搜索插件Rainbow Brackets 安装后重启IDEA 效果如图:不同层级的括号会变成不同的颜色,便于区分. 光标定位到前一个括号后,使用快捷键ALT+鼠标右键可以只查看当前括号中的内容 ...

  2. 2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和,换言之你

    2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和,换言之你 ...

  3. 开发人员使用HANA交付业务的学习路径

    本文于2019年7月22日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 入门 编程规范. 开发环境使用方法. 基本语法,与其它同类软件的 ...

  4. 一文读懂java中的Reference和引用类型

    目录 简介 强引用Strong Reference 软引用Soft Reference 弱引用weak Reference 虚引用PhantomReference Reference和Referenc ...

  5. 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场

    针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...

  6. 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 ...

  7. mysql 必知必会整理—sql 排序与过滤[三]

    前言 简单整理一下MySQL的排序与过滤. 正文 我们查询出来的结果有时候是希望进行排序的,比如说: select product_name from products order by prod_n ...

  8. 重学c#系列——索引器(十)

    前言 对于索引器,我们肯定不会陌生.为什么会有索引器这个东西呢?我们发现这东西很像是属性,只是通过索引方式去调用,那就慢慢揭开他的面纱吧. 正文 假设我们要对外暴露一个数组,为了体现其封装性,我们使用 ...

  9. Error:A problem occurred configuring project ':app'.

    前言 因为部门需要用到另外一个部门的库,而另外一个部门是c++部门,这种声音视频算法java做不了的. 如果是因为有引入c++库产生的这个问题,那么基本上你需要肯定你安装了ndk,如果没有安装那么会报 ...

  10. Mui 消息推送

    一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() {plus.navigator.closeSplashscreen(); ...