0

我的要求是stop-all多次运行脚本(重试 5 次),直到输出ps -fu user1 |wc -l小于 2。

我为此编写了以下 ansible 剧本:

cat stop.yml

  - hosts: dest_nodes
    tasks:
      - name: Start service
        include_tasks: "{{ playbook-dir }}/inner.yml"
        retries: 5
        delay: 4
        until: stopprocesscount.stdout is version('2', '<')


cat inner.yml

      - name: Start service
          shell: ~/stop-all
          register: stopprocess

      - name: Start service
          shell: ps -fu user1 |wc -l
          register: stopprocesscount

但是,运行剧本时出现以下错误。

ERROR! 'retries' is not a valid attribute for a TaskInclude

The error appears to be in '/app/playbook/stop.yml': line 19, column 9, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


      - name: Start service
        ^ here

你能建议吗?

4

2 回答 2

1

首先,更正中任务的缩进inner.yml。其次,删除retriesdelayfromuntil并将stop.yml它们移动到特定任务,因为这些是任务级参数。

由于您需要基于另一个任务重试一个任务,您可以将脚本和命令结合起来,提取 wc -l 命令的结果,如下所示:

由于 stdout_lines 将包含字符串列表和版本需要 int 因此转换。

内部.yml

  - name: Start service
    shell: ~/stop-all; ps -fu user1 | wc -l
    register: stopprocesscount
    retries: 5
    delay: 4
    until: stopprocesscount.stdout_lines[stopprocesscount.stdout_lines | length - 1] | int  is version('2', '<')

停止.yml

  - hosts: dest_nodes
    tasks:
      - name: Start service
        include_tasks: "{{ playbook-dir }}/inner.yml"
于 2020-05-21T00:57:08.457 回答
0

并非所有任务属性都适用于所有任务(此处为 TaskInclude 任务)。

没有明确的文档,这样的兼容性矩阵,但这里的错误消息很清楚“不是有效的属性”。

以实例为例:

你不能循环一个块:'with_items' is not a valid attribute for a Block

您不能异步 TaskInclude,请参阅https://github.com/ansible/ansible/issues/57051

于 2021-02-04T10:04:03.150 回答