首页 > 解决方案 > "msg": "该任务包含一个带有未定义变量的选项 - 打印一个步骤的输出

问题描述

所以我有一本用来终止用户的剧本:

---
- name: "Playbook: Terminate user"
    hosts: localhost
    gather_facts: True

    roles:
    - { role: common, tags: ['always'] }
    - { role: ad_termination, tags: ['ad_termination', 'never'] }

- name: "Playbook: Terminate storage"
    hosts: storage
    gather_facts: False
    roles:
    - { role: storage_termination, tags: ['storage_termination', 'always'] }

- name: "Playbook: User environment"
    hosts: localhost
    gather_facts: False

    roles:
    - { role: common,
        tags: ['always'],
        }

    - { role: send_summary_email,
        tags: ['send_summary_email', 'always']
        }

我使用以下命令调用它:

ansible-playbook userOperations/userTerminationPB.yml -t ad_termination -e "username=user". 然后它会遍历每个剧本(总共 3 个)。

前 2 个剧本(终止用户和终止存储)一切正常。我在传递第二个剧本 ( terminate storage) 中的变量时遇到问题。

如您所见,hosts为存储 playbook 配置的名为storage. 它拥有几台服务器。

这是剧本本身:

- name: Logical block of home-storage tasks
  block:
  - name: Check if home folder exists
    stat:
      path: "{{ hostvars[inventory_hostname].fspath }}/{{ username }}"
    register: home_dir_details

  - name: Move user home folder to terminated home folder
    command: mv {{ hostvars[inventory_hostname].fspath }}/{{ username }} "{{ hostvars[inventory_hostname].fspath }}/terminated/{{ username }}"
    when: home_dir_details.stat.exists
    register: storage_moved

  - name: Printing and debugging
    ansible.builtin.debug:
      msg: "{{ storage_moved }}"
  when: 
    - hostvars[inventory_hostname].fsname is search("home")

我正在尝试在电子邮件中总结所有内容。我的电子邮件是一个 jinja2 模板,我使用这些传递的变量对其进行编辑。

我的问题是当我{{ storage_moved }}在我的 Jinja2 模板(发送电子邮件的第三本剧本)中使用时,它不被识别为变量。

I'm not sure what to change in order for it to be recognized. I simply use {{ storage_moved }} in my template but it doesn't work.

It should print the following:

ok: [storage.server.com] => {
    "msg": {
        "changed": true,
        "cmd": [
            "mv",
            "/path/user",
            "/path/terminated/user"
        ],
        "delta": "0:00:00.006022",
        "end": "2021-10-19 16:13:03.468398",
        "failed": false,
        "rc": 0,
        "start": "2021-10-19 16:13:03.462376",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "",
        "stdout_lines": []
    }
}

Any help would be appreciated. Currently I'm getting:

"msg": "The task includes an option with an undefined variable. The error was: 'storage_moved' is undefined

Edit:

I was able to access all the info in storage_moved by using the following loop in my jinja2 tempalte:

{% for host in groups['storage'] %}
{{ hostvars[host]['storage_moved'] }}
{% endfor %}

标签: ansiblejinja2

解决方案


not tested, but you could add dummy host with var in the playbook where you defined your storage

   - name: Register dummy host with variable
     add_host:
       name: "DUMMY_HOST"
       STORAGE_NEW:  "{{ storage_moved }}"   #storage_moved.stdout

and in the other playbook you echo the variable:

  tasks:
   - name: Echo the output - storage_new var
     shell: cat {{ hostvars['DUMMY_HOST']['STORAGE_NEW'] }} |tail -1
     register: STORAGE_RESULT

推荐阅读