使用服务与命令时失败

时间:2014-12-19 15:06:37

标签: ansible ansible-playbook

我想确保在系统上存在服务列表时禁用它们。默认情况下,其中许多服务不存在,但在安装服务的情况下,我希望它被禁用。

如果服务不存在,ansible会抛出错误。虽然我可以使用ignore_error继续执行任务,但我对此并不满意,因为它不仅掩盖了真正的问题,而且错误仍然显示在ansible输出中,我更喜欢团队不习惯忽略错误。

我尝试过使用failed_when,但我似乎无法使用服务,并且所有示例都使用命令,而不是服务。这是任务 - disable_services是在别处声明的列表。

- name: "Stop and disable unneeded services"
  service: name={{ item }} enabled=no status=stopped
  failed_when: "'service not loaded' not in stderr"
  with_items: disable_services

它失败并显示以下输出:

TASK: [hardening | Stop and disable unneeded services] ************************ 
fatal: [host.example.com] => error while evaluating conditional: 'service not loaded' not in stderr  

我已经尝试注册变量service_output,并检查是否在service_output.stderr中看到“service not loaded”,但是有相同的错误。

是否可以在服务上使用failed_when,如果是,我在这里遇到的第8层问题是什么?

2 个答案:

答案 0 :(得分:11)

有一些问题:

  1. 它是state,而不是status
  2. 您需要使用register将结果绑定到变量,然后在failed_when中使用该变量。
  3. 次要的事情:你只检查一种失败(在这种情况下应该没问题,但要注意这一点)。
  4. 这应该有效:

    - name: "Stop and disable unneeded services"
      service: name={{ item }} enabled=no state=stopped
      failed_when: "stop_disabled_services | failed and 'service not found' not in stop_disabled_services.msg"
      register: stop_disabled_services
      with_items: disable_services
    

    关于我如何使用此代码的说明: 我已使用ignore_errorsdebug: var=stop_disable_services查找service失败时返回的内容。最有趣的部分是stop_disabled_services.results列表的项目,因为stop_disable_services failed_when将看到的值。 从那里只有一些Jinja2确保只有一些失败被忽略。

答案 1 :(得分:3)

我使用的解决方案与标记的答案不同。这个答案中列出的解决方案解决了我的问题,但没有按照我的要求回答问题,因此接受了答案。我认为这比我最初的努力要好得多。

我创建了一个命令,根据操作系统获取'已安装'服务,并将结果注册为变量。然后,我遍历已安装服务器和已禁用服务的交集。

这比遍历每个潜在服务并忽略错误更快 ,因为只有我关心的服务才会被尝试。 list_svcs_cmd是一个根据操作系统设置的变量。

---
- name: Get registered services
  shell: "{{ list_svcs_cmd }}"
  register: loaded_services

- name: "Stop and disable unneeded services"
  service: name={{ item }} enabled=no state=stopped
  with_items: disable_services | intersect(loaded_services.stdout_lines)