![如何根據金鑰隔離ansible輸出](https://rvso.com/image/747689/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%93%9A%E9%87%91%E9%91%B0%E9%9A%94%E9%9B%A2ansible%E8%BC%B8%E5%87%BA.png)
我正在嘗試隔離 ansible 劇本的輸出,但它說"output.stdout": "VARIABLE IS NOT DEFINED!"
我的劇本代碼是:
--- - hosts: localhost tasks: - name: Register variable shell: "echo {{ item }}" loop: - "one" - "two" register: output - debug: var: output.stdout
有趣的是,如果我不使用密鑰隔離偵錯輸出,則它可以正常工作stdout
。
TASK [Register variable] ***********************************************************************************************************************************************
changed: [localhost] => (item=one)
changed: [localhost] => (item=two)
TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
"output": {
"changed": true,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": true,
"cmd": "echo one",
"delta": "0:00:00.002986",
"end": "2020-01-24 00:20:57.226744",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "echo one",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
我究竟做錯了什麼 ?
答案1
當您使用帶有循環的暫存器時,放置在變數中的資料結構將包含一個結果屬性,該屬性是來自模組的所有回應的列表
因此:
output.results[0].stdout
output.results[1].stdout
答案2
一種更簡單的方法是循環到一個單獨的 .yml 檔案(透過 include),它將執行溫和的操作+輸出。例如:
主要.yml:
- name: RUN start.yml
include: start.yml
vars:
app: "{{ item.name }}"
static: false
with_items: "{{ list_items }}"
start.yml 具有相同的作用:
- name: "Run {{ app }}"
command: './runapp.sh {{ app }}'
register: start_app_register
no_log: True
- debug:
msg: '{{ start_app_register.stdout }}'