执行任务直到文件在 Ansible 中被删除

Perform task until the file gets deleted in Ansible

我会执行 kill 命令,直到文件“/proc/pid/status”或文件夹“/proc/pid”被删除。

下面是我的剧本:

- name: Kill running processes

  shell: "kill -9 {{ item }}"
  retries: 5
  delay: 4
  until: "/proc/{{ item }}/status is exists"
  with_items: "{{ running_processes.stdout_lines }}"

但是,我的剧本因以下错误而失败。

TASK [Kill running processes] **************************************************
[1;30mtask path: /app/scripts/test.yml:182[0m
[1;35mdelimiters such as {{ }} or {% %}. Found: /proc/{{ item }}/status is exists[0m
[1;35m[0m
[0;31mfatal: [10.9.9.131]: FAILED! => {"msg": "The conditional check '/proc/{{ item }}/status is exists' failed. The error was: Invalid conditional detected: invalid syntax (<unknown>, line 1)"}[0m

我使用的是最新版本的 Ansible。

你能建议我的剧本代码有什么问题吗?

错误是"Invalid conditional detected",是正确的。您写过:

  until: "/proc/{{ item }}/status is exists"

当你像这样写一个布尔表达式时,语法是:

<value> is <test>

其中 <value> 需要是文字值(如字符串或数字)或变量名。你有 /proc/<some number>/status,这是 none 的东西。您可以通过引用 /proc 路径使表达式 在语法上 正确,如下所示:

  until: "'/proc/{{ item }}/status' is exists"

但仍然存在一个问题:条件是在隐含的 jinja2 模板上下文中评估的,这意味着您永远不会使用 {{...}} 标记(untilwhen 都是如此).在模板上下文中,您仅按名称引用变量,并使用字符串格式化或字符串连接将它们与其他字符串放在一起。例如:

  until: "'/proc/%s/status' % item is exists"

或:

  until: "'/proc/{}/status'.format(item) is exists"

最后,我认为你的意思是 is not exists,因为你正在终止一个进程并等待它结束。


虽然上面给出了语法上正确的条件,但请务必注意 Ansible documentation 中的这一点:

Like all templating, tests always execute on the Ansible controller, not on the target of a task, as they test local data.

如果您的目标是远程主机,请记住 is exists 任务将在您所在的主机 上执行 运行 ansible在远程主机上。