重复使用寄存器保存的变量

时间:2019-09-12 21:23:46

标签: ansible

有人可以解释为什么发生以下情况:

我试图在两个不同的任务中重用相同的变量(output),其中只有一个任务将根据条件(bool)运行。我不明白为什么在运行以下剧本时debug hi任务会导致错误。

echo hellodebug hello按预期运行并工作,然后跳过echo hi(也预期为bool == True),但我不明白为什么debug hi导致错误。我得到的错误是:

The conditional check output.stdout == hi failed. The error was: error while evaluating conditional: output 'dict object' has no attribute stdout

为什么output变量不能在debug hi任务中持续存在?跳过debug hi时,好像失去了它的值。

- hosts: localhost
  vars:
    bool: True

  tasks:
  - name: echo hello
    shell: echo "hello"
    register: output
    when: bool == True

  - name: debug hello
    debug:
      msg: "hello"
    when: output.stdout == "hello"

  - name: echo hi
    shell: echo "hi"
    register: output
    when: bool != True

  - name: debug hi
    debug:
      msg: "hi"
    when: output.stdout == "hi"

3 个答案:

答案 0 :(得分:0)

即使任务被跳过,您仍将任务结果注册到output。以这些非常简单的任务为例:

  - command: echo Hello
    register: result
    when: false

  - debug:
      var: result

变量result仍被创建,并且具有以下内容:

    "result": {
        "changed": false,
        "skip_reason": "Conditional result was False",
        "skipped": true
    }

这仍然是非常有用的信息(即知道已跳过任务)。您将需要在游戏中考虑到这种逻辑。

答案 1 :(得分:0)

此任务:

- name: echo hi
    shell: echo "hi"
    register: output
    when: bool != True

注册output是否为bool

请参见ansible documentation

  

如果任务失败或被跳过,则仍以失败或跳过状态注册变量,避免注册变量的唯一方法是使用标签。

答案 2 :(得分:0)

您可以将最新的when:条件替换为:

when: output.stdout is defined and output.stdout == "hi"