【问题标题】:jinja2 expression to reference inventory collection to pass as parameter to shell scriptjinja2 表达式引用库存集合作为参数传递给 shell 脚本
【发布时间】:2019-12-13 03:19:40
【问题描述】:

我有一个主机文件 myEnv:

[myEnv:children]
app0
app1
app2

还有一个组文件 myEnv:

env: "myEnv"

在下面的剧本任务中,我尝试将环境(env 键的值)和该环境中的应用程序列表(myEnv:children)作为参数传递给 shell 脚本。只有环境('myEnv')被传递给脚本。我无法找出正确的 jinja2 语法来传递与此密钥关联的应用程序列表,该密钥位于我的 hosts 文件中。

- name: Run createFacts.sh in bin directory
  command: ./createFacts.sh {{ env }} {{ hostvars[env] }}
  register: createPuppetFacts
  args:
    chdir: "{{binHome}}"

为此我需要什么 jinja2 语法?我已经搜索了 ansible 文档和堆栈溢出,只是没有找到正确的格式...除了语法错误,我能做的最好的就是返回一个空字符串!

非常感谢这方面的帮助。

【问题讨论】:

    标签: ansible jinja2 ansible-inventory


    【解决方案1】:

    问:“将环境(env 键的值)和该环境中的应用程序列表 (myEnv:children) 作为参数传递给 shell 脚本。”

    A:给定库存

    $ cat hosts
    test_01
    test_02
    test_03
    
    [app0]
    test_01
    test_02
    test_03
    
    [app1]
    test_01
    test_02
    
    [app2]
    test_02
    test_03
    
    [myEnv:children]
    app0
    app1
    app2
    

    和 group_vars

    $ cat group_vars/myEnv 
    env: "myEnv"
    

    剧本

    $ cat playbook.yml
    - hosts: test_01
      tasks:
        - command: "/home/admin/createFacts.sh {{ env }}"
          register: result
        - debug:
            var: result.stdout
        - command: "/home/admin/createFacts.sh {{ groups[env] }}"
          register: result
        - debug:
            var: result.stdout
    

    用脚本

    $ cat /home/admin/createFacts.sh 
    #!/bin/sh
    echo $@
    exit 0
    

    给予

    ok: [test_01] => {
        "result.stdout": "myEnv"
    }
    
    ok: [test_01] => {
        "result.stdout": "[utest_01, utest_02, utest_03]"
    }
    

    注意事项

    • myEnv, app0, app1, app2 是组。见Inheriting variable values: group variables for groups of groups

    • env 的值为myEnv。这是一个组的名称。可以列出groups[env] 组的成员。但是hostvars[env] 肯定会失败,因为 hostvars 需要主机名作为参数。

    • Ansible 不向运行时提供组 myEnv 是组 app0, app1, app2 的父组的信息。

    • 有一个special variablegroup_names:“当前主机所属的组列表”

    下面的任务

    - debug:
        var: group_names
    

    给予

    ok: [test_01] => {
        "group_names": [
            "app0", 
            "app1", 
            "myEnv"
        ]
    }
    

    【讨论】:

    • 非常感谢您的及时回复。您的回答让我更清楚地解决了我的问题。在您的帮助下,我能够将主机上的环境、数据中心和应用程序传递给我的 shell 脚本。我不得不擦掉前缀/后缀上的 'u'、',' 和括号,但它可以工作。我已经决定而不是利用 bash 脚本(因为某些主机可以是 Windows),我可能最终会使用 jinja2 模板针对库存来推出这些文件。再次感谢您的帮助弗拉德!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多