我想确保在系统上存在服务列表时禁用它们。默认情况下,其中许多服务不存在,但在安装服务的情况下,我希望它被禁用。
如果服务不存在,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层问题是什么?
答案 0 :(得分:11)
有一些问题:
state
,而不是status
。register
将结果绑定到变量,然后在failed_when
中使用该变量。这应该有效:
- 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_errors
和debug: 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)