我将执行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。
您能否建议我的剧本代码有什么问题?
错误是“检测到无效的条件”,这是正确的。您已写过:
until: "/proc/{{ item }}/status is exists"
当您编写这样的布尔表达式时,语法为:
<value> is <test>
<value>
必须是文字值(如字符串或数字)或变量名。您有/proc/<some number>/status
,而这些都不是。您可以通过引用/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
,因为您正在杀死一个进程并等待其死亡。