具有动态键/值的Ansible Setting事实

时间:2019-11-15 21:04:42

标签: python ansible ansible-facts

我正在尝试从另一个角色调用的命令任务的标准输出中设置一个敏感事实。

角色A:

# vendor.js

import JQuery from 'jquery' 
window.$ = window.JQuery = JQuery

// rest of vendor.js code


#application.js
import './vendor.js'

//rest of application.js code

vars输出:

- name: example command
  command: client get -s {{ service }}
  register: vars_string

- name: set vars
  set_fact: vars={{ vars_string.stdout.split('\n')}}
  when:
    - vars_string.stdout | length > 0

- name: set vars as facts
  set_fact: "{{ item }}"
  with_items: "{{ vars }}"

角色B:

"vars": [
        "tst=ansible", 
        "example=values"
]

角色B的结果:

期望:- debug: var: tst

现实:{ "tst": "ansible" }

我试图将vars吐成字典并也使用{ "tst": "VARIABLE IS NOT DEFINED!" }。这返回了相同的结果。

我希望以后的角色可以通过命令返回的变量名进行调用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可能会对您的代码段感兴趣的两点:

  • 您的命令已经有一个按换行符分隔的版本,vars_string.stdout_lines
  • 我无法确定您是不是偶然选择了该变量,还是试图将分配实际分配给vars内置变量,但是无论哪种方式,请不要做到

据我所知,没有支持从一个任务中分配任意顶级主机事实的语法。

您有两种选择:将这些变量写到文件中,然后使用include_vars:读取它们-将它们分配为宿主事实,或者让set_fact:放弃所需的东西,满足那些生活在主机事实已知密钥下的动态变量

我们先显示后者,因为它更短:

- set_fact:
    my_facts: >-
      {{ "{" + (vars_string.stdout_lines
      | map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
      | join(",")) + "}"
      }}
  when:
  - vars_string.stdout | length > 0

当然,请注意,如果您的键或值中包含非JSON友好字符,那么欺骗就不会起作用,但是,如果该简单版本不起作用,请问一个后续问题,因为有很多问题同样的花招

include_vars:的方式是:

- tempfile:
    state: file
    suffix: .json
  register: vars_filename

- copy:
    dest: '{{ vars_filename.path }}'
    content: >-
       {{ "{" + (vars_string.stdout_lines
       | map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
       | join(",")) + "}"
       }}

- include_vars:
    file: '{{ vars_filename.path }}'

- file:
    path: '{{ vars_filename.path }}'
    state: absent