我正在尝试使用 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"