当有条件时如何在 Ansible 中打印命令输出?

sou*_*ser 5 ansible

我的 ansible 代码如下所示。问题是这只在我的库存有 dev、qa、perf 和 prod 服务器时才有效。例如,如果我的库存只有开发服务器,那么它就会失败。有什么办法可以避免这种失败吗?

我尝试将cmd_dev_out和更改cmd_qa_out为,cmd_out但这也没有帮助。

- 名称:执行
  主办方:全部
  任务:
    - name: 针对 dev 执行
      shell:一些命令
      寄存器:cmd_dev_out
      当:(服务器是开发者)

    - 调试:msg =“{{cmd_dev_out}}”

    - 名称:针对 qa 执行
      shell:一些命令
      注册:cmd_qa_out
      当:(服务器是质量保证)

    - 调试:msg =“{{cmd_qa_out}}”

    ......更多条件如下......

β.ε*_*.βε 3

最好是在这里使用 a对上述命令block的执行和输出的打印进行逻辑分组。command

因为,如果没有命令运行,显然你不会得到任何结果。

这是一个使用的示例block

- name: Execute
  hosts: all
  tasks:
    - block:
        - name: Execute against dev
          shell: 'echo "dev"'
          register: cmd_dev_out

        -  debug: 
             msg: "{{ cmd_dev_out }}"
      when: "'dev' in inventory_hostname"

    - block:
        - name: Execute against qa
          shell: 'echo "qa"'
          register: cmd_qa_out

        -  debug: 
             msg: "{{ cmd_qa_out }}"
      when: "'qa' in inventory_hostname"
Run Code Online (Sandbox Code Playgroud)

请注意,这意味着条件when现在与 the 相关联block,并且当条件为假时, thecommand和 the将被跳过。debug

回顾示例:

PLAY [localhost] **************************************************

TASK [Execute against dev] ****************************************
skipping: [localhost]

TASK [debug] ******************************************************
skipping: [localhost]

TASK [Execute against qa] *****************************************
changed: [localhost]

TASK [debug] ******************************************************
ok: [localhost] => 
  msg:
    changed: true
    cmd: echo "qa"
    delta: '0:00:00.002641'
    end: '2023-01-25 20:51:04.049532'
    failed: false
    msg: ''
    rc: 0
    start: '2023-01-25 20:51:04.046891'
    stderr: ''
    stderr_lines: []
    stdout: qa
    stdout_lines:
    - qa
Run Code Online (Sandbox Code Playgroud)

另一个但可能不太优雅的解决方案是在结果上使用defaultJinja 过滤器,以防跳过。commandcommand

PLAY [localhost] **************************************************

TASK [Execute against dev] ****************************************
skipping: [localhost]

TASK [debug] ******************************************************
skipping: [localhost]

TASK [Execute against qa] *****************************************
changed: [localhost]

TASK [debug] ******************************************************
ok: [localhost] => 
  msg:
    changed: true
    cmd: echo "qa"
    delta: '0:00:00.002641'
    end: '2023-01-25 20:51:04.049532'
    failed: false
    msg: ''
    rc: 0
    start: '2023-01-25 20:51:04.046891'
    stderr: ''
    stderr_lines: []
    stdout: qa
    stdout_lines:
    - qa
Run Code Online (Sandbox Code Playgroud)