在 ansible playbook 中的 shell 模块中使用 if else 语句

在 ansible playbook 中的 shell 模块中使用 if else 语句

我正在尝试在 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']

相关内容