Ansible async_status 任务 - 错误:ansible_job_id“未定义变量”

2023-11-29

我有一个 3 节点 ubuntu 20.04 lts - kvm - kubernetes 集群,kvm-host 也是 ubuntu 20.04 lts。我在 kvm 主机上运行了 playbook。 我有以下库存摘录:

nodes:
  hosts:
    sea_r:
      ansible_host: 192.168.122.60
    spring_r:
      ansible_host: 192.168.122.92
    island_r:
      ansible_host: 192.168.122.93
  vars:
    ansible_user: root

and 已经尝试了很多async_status,但总是失败,

- name: root commands
  hosts: nodes
  tasks:
  - name: bash commands
    ansible.builtin.shell: |
      apt update
    args:
      chdir: /root
      executable: /bin/bash
    async: 2000
    poll: 2
    register: output

  - name: check progress
    ansible.builtin.async_status:
      jid: "{{ output.ansible_job_id }}"
    register: job_result
    until: job_result.finished
    retries: 200
    delay: 5

有错误:

fatal: [sea_r]: FAILED! => {"msg": "The task
includes an option with an undefined variable. 
The error was: 'dict object' has no attribute
'ansible_job_id' ...

如果我尝试以下操作,

- name: root commands
  hosts: nodes
  tasks:
  - name: bash commands
    ansible.builtin.shell: |
      apt update
    args:
      chdir: /root
      executable: /bin/bash
    async: 2000
    poll: 2
    register: output
  - debug: msg="{{ output.stdout_lines }}"
  - debug: msg="{{ output.stderr_lines }}"

我没有收到任何错误。 还尝试了以下变化,

  - name: check progress
    ansible.builtin.async_status:
      jid: "{{ item.ansible_job_id }}"
    with_items: "{{ output }}"
    register: job_result
    until: job_result.finished
    retries: 200
    delay: 5

这是建议的作为类似错误的解决方案。这也没有帮助,我只是得到稍微不同的错误:

fatal: [sea_r]: FAILED! => {"msg": "The task includes
an option with an undefined variable. The error 
was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText
object' has no attribute 'ansible_job_id' ...

在剧本的开头和结尾,我恢复和暂停 3 个 kvm 服务器节点,如下所示:

- name: resume vms
  hosts: local_vm_ctl
  tasks:
  - name: resume vm servers
    shell: |
      virsh resume kub3
      virsh resume kub2
      virsh resume kub1
      virsh list --state-paused --state-running
    args:
      chdir: /home/bi
      executable: /bin/bash
    environment:
      LIBVIRT_DEFAULT_URI: qemu:///system
    register: output
  - debug: msg="{{ output.stdout_lines }}"
  - debug: msg="{{ output.stderr_lines }}"

and so

- name: pause vms
  hosts: local_vm_ctl
  tasks:
  - name: suspend vm servers
    shell: |
      virsh suspend kub3
      virsh suspend kub2
      virsh suspend kub1
      virsh list --state-paused --state-running
    args:
      chdir: /home/bi
      executable: /bin/bash
    environment:
      LIBVIRT_DEFAULT_URI: qemu:///system
    register: output
  - debug: msg="{{ output.stdout_lines }}"
  - debug: msg="{{ output.stderr_lines }}"

但我不明白这些戏剧与上述错误有什么关系。

任何帮助都感激不尽。


您的作业 ID 出现未定义错误,因为:

  1. You use poll: X在您的初始任务中,ansible 每 X 秒连接一次以检查任务是否完成
  2. 当 ansible 存在该任务并进入您的下一个任务时async_status任务,工作完成了。由于您使用了非零值poll异步状态缓存会自动清除。
  3. 由于缓存被清除,作业 ID 不再存在。

上述场景旨在避免目标在长时间运行的任务上超时,而不是同时运行任务并对其状态设置稍后的检查点。对于第二个要求,您需要运行异步任务poll: 0并自行清理缓存

有关上述概念的更多解释,请参阅文档:

  • ansible 异步指南
  • ansible async_status module

我用您的上述任务做了一个示例,并将其修复为使用专用模块apt(请注意,您可以添加name带有一个或一系列软件包的模块的选项,ansible 将在一个步骤中完成缓存更新和安装)。还,retries * delayasync_status 任务上的值应等于或大于async如果您想确保不会错过最后的任务,请在初始任务上进行。

- name: Update apt cache
  ansible.builtin.apt:
    update_cache: true
  async: 2000
  poll: 0
  register: output

- name: check progress
  ansible.builtin.async_status:
    jid: "{{ output.ansible_job_id }}"
  register: job_result
  until: job_result.finished
  retries: 400
  delay: 5

- name: clean async job cache 
  ansible.builtin.async_status:
    jid: "{{ output.ansible_job_id }}"
    mode: cleanup

这对于并行启动一堆长期持续的任务更有用。这是一个无用但实用的示例:

- name: launch some loooooong tasks
  shell: "{{ item }}"
  loop:
    - sleep 30
    - sleep 20
    - sleep 35
  async: 100
  poll: 0
  register: long_cmd

- name: wait until all commands are done
  async_status:
    jid: "{{ item.ansible_job_id }}"
  register: async_poll_result
  until: async_poll_result.finished
  retries: 50
  delay: 2
  loop: "{{ long_cmd.results }}"

- name: clean async job cache
  async_status:
    jid: "{{ item.ansible_job_id }}"
    mode: cleanup
  loop: "{{ long_cmd.results }}"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ansible async_status 任务 - 错误:ansible_job_id“未定义变量” 的相关文章

  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • Bash 中的 Shellshock 漏洞背后的行为是有记录的还是有意为之?

    最近的一个漏洞 CVE 2014 6271 http web nvd nist gov view vuln detail vulnId CVE 2014 6271 如何Bash http en wikipedia org wiki Bash
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • PHP:测试三个变量是否相等

    我以前从未遇到过这种情况 但是如何测试三个变量是否相同 以下内容显然不起作用 但我想不出一种优雅 且正确 的方式来编写以下内容 if select above average select average select below aver
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • C 编程:正向变量参数列表

    我正在尝试编写一个函数 它接受可变数量的参数 如 printf 执行一些操作 然后将变量列表传递给 printf 我不知道如何做到这一点 因为它似乎必须将它们推入堆栈 大约是这样的 http pastie org 694844 http p
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • ansible:基于 extra-vars 文件的任务顺序

    我有包含 10 个任务的 ansible 剧本 任务的顺序因用例而异 因此我必须为每个用例创建 extraVar yml 文件 并且 extraVar yml 将定义任务的顺序 怎么做 Example 剧本 tasks name task1
  • 如何使用 Ansible when 条件在文件中搜索字符串

    我有一个变量中用 n 分隔的搜索字符串列表listofips 我想在文件中搜索该字符串hello csv在我的下面playbook dir 我可能遇到一些语法问题 我不确定 但下面是我尝试过的 set fact listofips 10 0
  • IFS 分隔一个字符串,如“Hello”,“World”,“this”,“is,一个无聊”,“line”

    我正在尝试解析 csv 文件 但 IFS 遇到一些问题 该文件包含如下行 Hello World this is a boring line 各列用逗号分隔 因此我尝试使用以下代码分解该行 IFS read r a tempArr lt l
  • javascript - 动态变量

    您好 我正在尝试创建动态变量 但它说 变量 v0 到 v5 未定义 td each function i eval var v i this html 任何帮助将不胜感激 这听起来是个坏主意 你有什么理由不能这样做吗 var tdHtml
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • 液体字符串中的转义字符

    我正在尝试将包含各种尺寸的标签列表放在一起 在 Shopify 中使用 Liquid 尺寸使用单引号和双引号表示英寸和英尺 因为它同时使用两者 所以会导致字符串正确关闭的问题 我尝试过使用标准转义字符 但这似乎不起作用 是否可以在 Liqu
  • Mac OS X 中 Bash 脚本中的 SFTP 命令

    我需要使用 SFTP 和 SSH 从 Mac 主机将文本文件传输到远程 PC freeSSH 这两个连接在本地网络中 那么有没有办法从 Bash 脚本内部运行 SFTP 命令 使用提供的用户名和密码 我已经尝试过一些脚本expect 但我没
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 连接到上游时 Nginx 错误:(13:权限被拒绝)

    我在我的中收到此错误nginx error log file 2014 02 17 03 42 20 crit 5455 0 1 connect to unix tmp uwsgi sock failed 13 Permission den

随机推荐