我正在尝试在 ansible playbook 中的 shell 模块内运行 if else 语句,但看起来我的 else 语句无论如何都没有执行。
- name: verify application/database processes are not running
shell: if ps -eaf | egrep 'apache|http'|grep -v grep > /dev/null echo 'process_running';else echo 'process_not_running';fi
ignore_errors: false
register: app_process_check
请在这里纠正我。
答案1
如果您只想确保服务正在运行,则无需亲自检查,ansible 可以为您处理。
- name: ensure apache is started
service:
name: apache2
state: started
如果它没有运行,Ansible 将启动它,如果它已经运行,则不会执行任何操作。
如果您因为其他原因需要检查这一点,您可以在 ansible 而不是 shell 中进行检查:
- name: check if apache is running
shell: ps -eaf
register: running_processes
changed_when: >
('apache' in running_processes.stdout) or
('httpd' in running_processes.stdout)
之后您可以使用它running_processes.changed
(或将检查本身移至下一个任务)。
答案2
修复如果-那么-否则语句。关键字然后缺失。我已添加附言范围-X包括 ”没有控制终端的进程“(通常 Web 服务器不会这样做)。下面的脚本按预期运行
#!/bin/sh
if ps -axef | egrep 'apache|http' | grep -v grep > /dev/null; then
echo 'process_running'
else
echo 'process_not_running'
fi
然后在 Ansible 中使用该脚本。你可能想要使用文字块标量提高代码的可读性。例如
- name: verify application/database processes are not running
shell: |
if ps -axef | egrep 'apache|http' | grep -v grep > /dev/null; then
echo 'process_running'
else
echo 'process_not_running'
fi
ignore_errors: false
register: app_process_check
- debug:
var: app_process_check.stdout
如果 Apache 正在运行,则显示
app_process_check.stdout: process_running
否则
app_process_check.stdout: process_not_running
答案3
不要使用 command:/shell:,而要考虑 ansible.builtin.service_facts: 模块。 ansible.docs 页面的 service_facts
从该页面开始:
- name: Populate service facts
service_facts:
- debug:
var: ansible_facts.services
从那里您可以访问有关配置服务的各种事实。
ansible_facts.services['httpd']
或者ansible_facts.services['apache']