• 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 }}"

    执行结果:

  • 相关阅读:
    事件节流函数封装层
    rem布局
    对象克隆2
    HTTP的请求头标签 If-Modified-Since
    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    idea 内置tomcat jersey 跨服务器 上传文件报400错误
    idea 内置tomcat jersey 上传文件报403错误
    java 配置aop 写入无效
    java中AOP的环绕通知
    java的Test 如何使用@Autowired注解
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12657016.html
Copyright © 2020-2023  润新知