如何根據金鑰隔離ansible輸出

如何根據金鑰隔離ansible輸出

我正在嘗試隔離 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

https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#registering-variables-with-a-loop

當您使用帶有循環的暫存器時,放置在變數中的資料結構將包含一個結果屬性,該屬性是來自模組的所有回應的列表

因此:

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 }}'

相關內容