执行任务直到文件在 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 模板上下文中评估的,这意味着您永远不会使用 {{...}}
标记(until
和 when
都是如此).在模板上下文中,您仅按名称引用变量,并使用字符串格式化或字符串连接将它们与其他字符串放在一起。例如:
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,不在远程主机上。
我会执行 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 模板上下文中评估的,这意味着您永远不会使用 {{...}}
标记(until
和 when
都是如此).在模板上下文中,您仅按名称引用变量,并使用字符串格式化或字符串连接将它们与其他字符串放在一起。例如:
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,不在远程主机上。