zoukankan      html  css  js  c++  java
  • ansible——playbook变量与引用

    1.通过Inventory文件定义主机及主机组变量

    当机器数量不多的时候,Ansible操控机器的时候会去Inventory里面获取主机信息,
    此时我们就可以将变量传过去,默认Inventory配置文件为/etc/ansible/hosts.

    playbook文件:variable.yaml

    ---
    - hosts: all
      gather_facts: False
      tasks:
      - name: display Host Variable from hostfile
        debug: msg="The {{ inventory_hostname }} Value is {{ key }}"

    执行结果:

    上面我们是给每一个主机配置一个key,我们可以配置一个nginx组拥有的key

    执行结果:

    当然,每个主机自己的变量优先级更高。只有当找不着自己的key才会使用组的key。
    如果没有找到,肯定报错:

    2.通过group_vars和host_vars文件定义主机及主机组变量

    首先需要说明的通过这种方式定义的文件名称需要与hosts中定义的主机和主机组的名称一致。

    比如,在hosts中定义了一个主机组nginx以及129.28.86.57,那么在定义变量名称是也必须这样定义

    查看变量文件:

    上面148写成140,结果:

    系统找不到148.70.122.28这台主机的变量,所以只能引用组变量。

    nginx组变量:

    需要说明的是,你必须使用group_varshost_vars这两个文件名,不然ansible找不到。
    对于上面两个目录可以存放在三个位置都可以:当前目录(执行playbook的位置)、home目录和/etc/ansible/(配置文件位置)
    这三个目录也是ansible所有文件的加载顺序。

    3.通过ansible-playbook命令行传参

    不论是shell还是python脚本,在执行脚本的时候可以命令行传参。
    playbook也可以看作是脚本,因此也可以通过命令行传参。

    命令行传参也可以通过文件的方式。支持YAML和JSON格式:
    通过YAML格式的文件传参:

    执行结果:

    通过JSON格式的文件传参:

    执行结果:

    这种方式和第二种方式有些类似,都是通过文件定义。
    但是还是有区别,group_vars和host_vars都是写死的,必须用这个名字,因为ansible就是这样帮你定义的。
    而命令行传参是可以指定任意文件,只要符合规范都行。

    4.在playbook文件内传参

    我们可以直接在playbook脚本中定义变量。

    定义variable.yaml文件

    ---
    - hosts: all
      gather_facts: False
      vars: 
        key: playbook_var
      tasks:
      - name: display Host Variable from hostfile
        debug: msg="The {{ inventory_hostname }} Value is {{ key }}"

    执行结果:

    5.在playbook文件内使用vars_files

    在playbook中可以通过定义vars的方式来传参,那么也就可以通过文件的方式
    变量配置文件:

    playbook文件:

    执行结果:

    参数的优先级:
      命令行>vars_files>vars>host_vars>group_vars>hosts

    6.使用register内的变量

    在playbook里面,task之间可以互相传递结果。
    下面这个示例中,第二个task需要用到第一个task的运行结果。
    register就是用来定义一个变量接收值,然后被复用

    定义variable2.yaml:

    ---
    - hosts: all
      gather_facts: False
      tasks:
        - name: register variable
          shell: hostname
          register: info
    
        - name: display variable
          debug: msg="The variable is {{ info }}" 

    执行结果:

    stdout代表输出。
    我们可以看出,这个输出结果其实是一个字典,我们可以直接去里面的值:

    ---
    - hosts: all
      gather_facts: False
      tasks:
        - name: register variable
          shell: hostname
          register: info
    
        - name: display variable
          debug: msg="The variable is {{ info['stdout'] }}" 

    执行结果:

    暂时貌似只会取stdout这个参数的值,后续还要参考官方文档。

    7.使用vars_prompt传值

    Ansible还支持在运行playbook的时候交互式传参,只需要使用vars_prompt定义变量名即可。

    定义prompt.yaml文件:

    ---
    - hosts: all
      vars_prompt:
        - name: "one"
          prompt: "please input one value"
          private: no
    
        - name: "two"
          prompt: "please input two value"
          default: "good"
          private: yes
    
      tasks:
        - name: display one value
          debug: msg="one value is {{ one }}"
        - name: display two value
          debug: msg="two value is {{ two }}"

    执行结果:

  • 相关阅读:
    awk 连接字符串
    VCF (Variant Call Format)格式详解
    Extracting info from VCF files
    JAVA中AES对称加密和解密
    关于Java中常用加密/解密方法的实现
    Java的MD5加密和解密
    java实现MD5加密
    Java中String和byte[]间的转换浅析
    Java中字符串和byte数组之间的相互转换
    字符串与byte[]之间的转换
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12657016.html
Copyright © 2011-2022 走看看