zoukankan      html  css  js  c++  java
  • 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节

  • 相关阅读:
    leetcode之Unique Binary Search Trees
    c++ 非常量引用产生临时对象
    redis的启动脚本
    leetcode 之 Insertion Sort List
    leetcode 之 Product of Array Except Self
    一致性hash的由来和原理
    我的vim 配置
    【原创】html页面清除浮动的几种方法
    实现本页面跳转的几种方式
    php输出语句用法总结
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/13555034.html
Copyright © 2011-2022 走看看