如何解决如何动态地为每个任务注册一个变量并将这些变量添加到列表中,以便我可以在 ansible playbook 的稍后部分使用它?
真实场景是,
我在一个清单组中有 n 个主机,并且 playbook 必须为特定的清单主机名运行特定的 * 命令(使用 ansible when 条件语句完成),但是每当条件满足时,我需要为上述 * 注册一个变量命令结果。
所以这个变量的创建应该动态完成,这些创建的变量应该附加到一个列表中,然后在同一个剧本的末尾通过将列表传递给一个循环,我必须检查工作 async_status。
有人可以帮我吗?
tasks:
-name:
command:
when: invenory_hostname == x
async: 360
poll:0
regsiter: "here dynamic variable"
-name:
command:
when: invenory_hostname == x
async: 360
poll:0
regsiter: "here dynamic variable"
-name:
command:
when: invenory_hostname == x
async: 360
poll:0
regsiter: "here dynamic variable" #his will continue based on the requirments
-name: collect the job ids
async_status:
jid:{item}
with_items:"list which has all the dynamically registered variables"
解决方法
如果你能把它写成一个循环而不是一系列独立的任务,这会变得容易得多。例如:
tasks:
- command: "{{ item }}"
register: results
loop:
- "command1 ..."
- "command2 ..."
- name: show command output
debug:
msg: "{{ item.stdout }}"
loop: "{{ results.results }}"
有关“Registering variables with a loop”的文档讨论了此任务执行后 results
的结构会是什么样子。
如果你真的需要编写独立的任务,你可以使用
vars
查找以查找所有任务的结果,如下所示:
tasks:
- name: task 1
command: echo task1
register: task_result_1
- name: task 2
command: echo task2
register: task_result_2
- name: task 3
command: echo task3
register: task_result_3
- name: show results
debug:
msg: "{{ item }}"
loop: "{{ q('vars',*q('varnames','^task_result_')) }}"
loop_control:
label: "{{ item.cmd }}"
您已更新问题以表明您正在使用异步任务,因此
这有点改变了。在这个例子中,我们使用一个 until
循环
在检查每个作业的状态之前等待每个作业完成
下一份工作。 gather results
任务不会退出,直到所有异步
任务已完成。
这是使用循环的解决方案:
- hosts: localhost
gather_facts: false
tasks:
- name: run tasks
command: "{{ item }}"
async: 360
poll: 0
register: task_results
loop:
- sleep 1
- sleep 5
- sleep 10
- name: gather results
async_status:
jid: "{{ item.ansible_job_id }}"
register: status
until: status.finished
loop: "{{ task_results.results }}"
- debug:
var: status
同样的事情使用单独的任务:
- hosts: localhost
gather_facts: false
tasks:
- name: task 1
command: sleep 1
async: 360
poll: 0
register: task_result_1
- name: task 2
command: sleep 5
async: 360
poll: 0
register: task_result_2
- name: task 3
command: sleep 10
async: 360
poll: 0
register: task_result_3
- name: gather results
async_status:
jid: "{{ item.ansible_job_id }}"
register: status
until: status.finished
loop: "{{ q('vars','^task_result_')) }}"
- debug:
var: status
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。