我正在尝试从另一个角色调用的命令任务的标准输出中设置一个敏感事实。
角色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!" }
。这返回了相同的结果。
我希望以后的角色可以通过命令返回的变量名进行调用。有什么想法吗?
答案 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