使用 ansible 循环直到使用 stdout_lines

使用 ansible 循环直到使用 stdout_lines

我正在尝试使用 ansible 循环,直到满足条件。until如果输出只有一行,我可以使用,但是如果输出有多行,我将需要使用stdout_lines但无法这样做。

如果输出是单行:

- name: check on sync status
  shell: some command
  register: sync_status
  until: sync_status.stdout == 'SSUS'

如果输出是多行,那么我尝试使用stdout_lines

- name: check on sync status
  shell: some command 
  register: sync_status
  until: item.stdout_lines == 'SSUS'
  with_items: "{{ sync_status }}"

但是我得到了未定义的变量:

fatal: [xxxxxxx]: FAILED! => {
    "msg": "'sync_status' is undefined"
}

我不想在单独的任务上执行此操作,因为 sync_status 已在之前的任务中注册,我将比较旧状态而不是当前状态。

请协助。

答案1

例如,给定文件和剧本

shell> cat test.txt 
XX

shell> cat playbook.yml
- hosts: localhost
  tasks:
    - ansible.builtin.command:
        cmd: cat test.txt
      register: sync_status
      until: sync_status.stdout == 'SSUS'

任务将会失败

TASK [ansible.builtin.command] ********************************************
FAILED - RETRYING: ansible.builtin.command (3 retries left).
FAILED - RETRYING: ansible.builtin.command (2 retries left).
FAILED - RETRYING: ansible.builtin.command (1 retries left).
fatal: [localhost]: FAILED! => changed=true 
  attempts: 3
  cmd:
  - cat
  - test.txt
  delta: '0:00:00.003479'
  end: '2021-06-16 07:27:19.927499'
  rc: 0
  start: '2021-06-16 07:27:19.924020'
  stderr: ''
  stderr_lines: <omitted>
  stdout: XX
  stdout_lines: <omitted>

但是,如果在测试之前或测试期间将字符串“SSUS”插入文件中,则任务将会成功,例如

TASK [ansible.builtin.command] ********************************************
FAILED - RETRYING: ansible.builtin.command (3 retries left).
FAILED - RETRYING: ansible.builtin.command (2 retries left).
changed: [localhost]

适合参数满足您的需求。


问:如果输出有多行,我将需要使用 stdout_lines。

A:测试字符串是否存在于列表中,例如

    - ansible.builtin.command:
        cmd: cat test.txt
      register: sync_status
      until: "'SSUS' in sync_status.stdout_lines"

相关内容