英文:
How to print a message for each async loop item?
问题
以下是剧本的一部分。如何在每次循环项运行命令后打印一条消息?类似这样:
image.pyc 正在为 item1 运行
image.pyc 正在为 item2 运行
等等
- name: Image Server(s)
command: python3 image.pyc {{ item }} "{{ systemVersion }}"
register: async_out
async: 7200
poll: 0
with_items: "{{ hostinfo_input.hosts }}"
我想要的只是这个:
任务 [Image Server(s)] *************
changed: [localhost] => (item=8m007)
changed: [localhost] => (item=8m013)
为 8m007 运行 image.pyc
为 8m013 运行 image.pyc
英文:
Below is a snippet from a playbook. How can I print a message after the command is run for each loop item? Something like
image.pyc is now running for item1
image.pyc is now running for item2
and so on
- name: Image Server(s)
command: python3 image.pyc {{ item }} "{{ systemVersion }}"
register: async_out
async: 7200
poll: 0
with_items: "{{ hostinfo_input.hosts }}"
What I want is simply this
TASK [Image Server(s)] *************
changed: [localhost] => (item=8m007)
changed: [localhost] => (item=8m013)
Running image.pyc for 8m007
Running image.pyc for 8m013
答案1
得分: 2
以下是代码部分的中文翻译:
- name: 图像服务器
ansible.builtin.command: python3 image.pyc {{ item }} "{{ systemVersion }}"
register: async_out
async: 7200
poll: 0
with_items: "{{ hostinfo_input.hosts }}"
- name: 等待命令完成
ansible.builtin.async_status:
jid: "{{ item.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 720
delay: 10
loop: "{{ async_out.results }}"
- name: 显示异步命令输出
ansible.builtin.debug:
msg: "{{ item.stdout }}"
loop: "{{ async_out.results }}"
- name: 好客人总是在完成后清理
ansible.builtin.async_status:
jid: "{{ item.ansible_job_id }}"
mode: cleanup
loop: "{{ async_out.results }}"
参考链接:
英文:
In a nutshell, extremely simple, untested, to be adapted to your use case specifically in terms of error/output control:
- name: Image Server(s)
ansible.builtin.command: python3 image.pyc {{ item }} "{{ systemVersion }}"
register: async_out
async: 7200
poll: 0
with_items: "{{ hostinfo_input.hosts }}"
- name: Wait for commands to finish
ansible.builtin.async_status:
jid: "{{ item.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: 720
delay: 10
loop: "{{ async_out.results }}"
- name: Show async command output
ansible.builtin.debug:
msg: "{{ item.stdout }}"
loop: "{{ async_out.results }}"
- name: Good guests always clean up after themselves
ansible.builtin.async_status:
jid: "{{ item.ansible_job_id }}"
mode: cleanup
loop: "{{ async_out.results }}"
References:
答案2
得分: 0
查看 Ansible
文档中关于 debug
模块的信息:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/debug_module.html
例如,可以像这样使用它:
# playbook.yaml
---
- hosts: localhost
connection: local
vars:
ip_addresses:
- 10.0.0.10
- 10.0.0.11
tasks:
- name: Task
include_tasks: task.yaml
loop: "{{ ip_addresses }}"
# task.yaml
---
- name: Command
ansible.builtin.shell: "echo {{ item }}"
register: output
- name: Message
ansible.builtin.debug:
msg: |
- ip_address={{ item }}
- ouput={{ output }}
不幸的是,这在使用 async
时无法工作。请参考 https://github.com/ansible/ansible/issues/22716。
英文:
Have a look at Ansible
documentation for the debug
module: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/debug_module.html
E.g.use it like this:
# playbook.yaml
---
- hosts: localhost
connection: local
vars:
ip_addresses:
- 10.0.0.10
- 10.0.0.11
tasks:
- name: Task
include_tasks: task.yaml
loop: "{{ ip_addresses }}"
# task.yaml
---
- name: Command
ansible.builtin.shell: "echo {{ item }}"
register: output
- name: Message
ansible.builtin.debug:
msg: |
- ip_address={{ item }}
- ouput={{ output }}
Unfortunately this does not work with async
. See https://github.com/ansible/ansible/issues/22716.
答案3
得分: 0
您目前描述的要求如下:
在每次循环项目运行命令后,如何打印消息?
可以通过loop
输出与label
来实现。
这是为了使控制台输出更易读...
例如:
---
- hosts: test
become: false
gather_facts: false
tasks:
- name: Image Server(s)
command: "python3 image.pyc {{ item }} {{ systemVersion }}"
register: async_out
async: 7200
poll: 0
loop: "{{ ansible_play_hosts }}"
loop_control:
label: "Running image.pyc for {{ item }}"
结果输出为:
TASK [Image Server(s)] *******************************************************
changed: [test1.example.com] => (item=Running image.pyc for test1.example.com)
changed: [test2.example.com] => (item=Running image.pyc for test2.example.com)
...
给出的示例仅在命令发送到远程节点并在那里启动后提供消息。这简单地因为没有定义谁应该提供(打印)消息,loop
通过label
,async
或script
都可以实现。请参考@Zeitounator的评论。
英文:
Your requirement as it is described currently
> How can I print a message after the command is run for each loop item?
could just be fulfilled by loop
output with label
> This is for making console output more readable ...
in example
---
- hosts: test
become: false
gather_facts: false
tasks:
- name: Image Server(s)
command: "python3 image.pyc {{ item }} {{ systemVersion }}"
register: async_out
async: 7200
poll: 0
loop: "{{ ansible_play_hosts }}"
loop_control:
label: "Running image.pyc for {{ item }}"
resulting into an output of
TASK [Image Server(s)] *******************************************************
changed: [test1.example.com] => (item=Running image.pyc for test1.example.com)
changed: [test2.example.com] => (item=Running image.pyc for test2.example.com)
...
The given example just provides the message after the command is sent over to the Remote Node and was started there. That is simply working because it is not defined who should provide (print) the message, the loop
via label
, async
or the script
. See also the comment of @Zeitounator ...
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论