我有一个看起来像这样的剧本:
- hosts: host1
gather_facts: false
tasks:
- name: "Loop"
command: "echo {{ item }}"
with_items: [ 0, 2, 4, 6, 8, 10 ]
register: hello
- debug: "msg={{ hello.results }}"
一切正常,输出结果返回,但是有大量的输出。事实证明:
- debug: "msg={{ hello.results.1.stdout }}"
完全符合我的要求 - 只需从命令中获取stdout - 但只能通过循环中的六次之一。
我真正想要/需要做的是:
- debug: "msg={{ hello.results.*.stdout }}"
进入hello
结构,访问results
条目,转到该数组的每个成员,并提取stdout
值。
这可能吗?
- hosts: host1
gather_facts: false
tasks:
- name: "Loop"
command: "echo {{ item }}"
with_items: [ 0, 2, 4, 6, 8, 10 ]
register: hello
- debug:
msg: "{{item.stdout}}"
with_items: "{{hello.results}}"
并不比我原来的例子详细。
TASK [debug] *******************************************************************
ok: [host1] => (item={'_ansible_parsed': True, 'stderr_lines': [], u'cmd': [
u'echo', u'0'], u'end': u'2018-01-02 20:53:08.916774', '_ansible_no_log': False
, u'stdout': u'0', '_ansible_item_result': True, u'changed': True, 'item': 0,
u'delta': u'0:00:00.002137', u'stderr': u'', u'rc': 0, u'invocation': {u'module_
args': {u'warn': True, u'executable': None, u'_uses_shell': False, u'_raw_params
': u'echo 0', u'removes': None, u'creates': None, u'chdir': None, u'stdin': Non
e}}, 'stdout_lines': [u'0'], u'start': u'2018-01-02 20:53:08.914637', 'failed':
False}) => {
"item": {
"changed": true,
"cmd": [
"echo",
"0"
],
"delta": "0:00:00.002137",
"end": "2018-01-02 20:53:08.916774",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "echo 0",
"_uses_shell": false,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": 0,
"rc": 0,
"start": "2018-01-02 20:53:08.914637",
"stderr": "",
"stderr_lines": [],
"stdout": "0",
"stdout_lines": [
"0"
]
},
"msg": "0"
}
我得到了上述结构的6份副本。
感觉我好近,但我仍然做错了什么。我在底部看到"msg": "0"
,这就是我想要的。我只是不想要其余部分。
答案 0 :(得分:0)
不确定。 ansible网站提供了解释how to use register
in a loop的文档。您只需要迭代hello.results
数组,如:
- debug:
msg: "{{item.stdout}}"
with_items: "{{hello.results}}"
答案 1 :(得分:0)
怎么样:
- debug: "msg={{ item.stdout }}"
with_items: "{{ hello.results }}"
答案 2 :(得分:0)
<强>解决方案强>:
export class AutocompleteComponent implements OnInit {
myControl = new FormControl();
//Works with these values
options = [
'One',
'Two',
'Three'
];
books: Book[] = [];
filteredOptions: Observable<string[]>
constructor(private bookService: BookService) {
this.bookService.getBooks()
.subscribe(
data => {
this.books = data;
},
(err: HttpErrorResponse) => {
console.log(err.statusText);
}
);
}
ngOnInit() {
this.filteredOptions = this.myControl.valueChanges
.startWith('')
.map(val => {
return this.filter(val)
})
}
filter(val: string): Book[] {
return this.books.filter(option =>
option.toLowerCase().indexOf(val.toLowerCase()) === 0);
}
}
<强>备注强>:
默认情况下,Ansible将打印可见的- debug: "msg={{ hello.results | map(attribute='stdout') | join('\n') }}"
双字符序列而不是包装行,因此要么使用回调插件来显示人类可读的输出(example),要么使用以下方法验证方法:< / p>
\n
并检查- copy:
content: "{{ hello.results | map(attribute='stdout') | join('\n') }}"
dest: ./result.txt
。
答案 3 :(得分:0)
我认为这种结构足以满足我的需求。
- hosts: localhost
gather_facts: false
vars:
stuff: [ 0,2,4,6,8,10 ]
tasks:
- name: "Loop"
command: "echo {{ item }}"
with_items: "{{ stuff }}"
register: hello
- debug: "var=hello.results.{{item}}.stdout"
with_sequence: "0-{{stuff|length - 1}}"
答案 4 :(得分:0)
我已经使用关键字 loop 从上一个循环的所有迭代中获取 stdout :
loop: "{{ hello | json_query('results[*].stdout') }}"
我发现在这种寄存器循环情况下最容易使用json_query。官方文档可以在这里找到==> json-query-filter