问题描述
在使用Salt时,用户遇到一个问题:他需要在所有服务器上默认禁用特定的服务,但是他希望能够创建一个pillar来允许他覆盖这个设置,允许pillar中指定的特定服务器运行这些服务。为了讨论方便,假设这个服务是httpd。
用户已经创建了一个非常简单的状态文件“disable_httpd.sls”,内容如下:
{% from "security/map.jinja" import security with context %}
stop and disable httpd-server:
service.dead:
- name: httpd
- enable: False
然而,对于一些Web服务器,用户希望允许它们继续运行httpd服务,但是当前的状态文件会影响这些服务器。
用户尝试过在pillar中设置免除特定服务器的方法,但目前还没有成功。
解决方案
请注意以下操作可能涉及版本差异或需要做好备份。
用户的思路是正确的,但在实际操作中出现了一些问题。首先,我们来修正一下用户的尝试过的解决方案。
修正方案
在修改状态文件时,需要注意allow_httpd
在pillar中的值是一个布尔类型,而不是字符串类型。因此,在判断allow_httpd
时,应该直接使用布尔值,而不是判断它是否是字符串。
以下是修正后的状态文件示例:
{% from "security/map.jinja" import security with context %}
{% set allow_httpd = salt['pillar.get']('security:options:allow_httpd', False) %}
{% if allow_httpd %}
Make sure httpd service is running:
service.enabled:
- name: httpd
{% else %}
stop and disable httpd:
service.dead:
- name: httpd
- enable: False
{% endif %}
同时,在pillar文件中,也要注意将布尔值True
表示为不带引号的True
,如下所示:
security:
options:
allow_httpd: True
这样修改后,状态文件会根据pillar中的布尔值来判断是否运行httpd服务。
配置pillar
用户还需要配置pillar以确保在正确的服务器上应用这些设置。
在pillar目录中,创建一个名为top.sls
的文件,用于匹配服务器和pillar文件。以下是一个示例top.sls
文件:
base:
'saltminion1.local':
- security.saltminion1
在上面的示例中,我们将服务器saltminion1.local
与名为security.saltminion1
的pillar文件相关联。这意味着只有saltminion1.local
服务器会使用这个pillar文件中的设置。
配置pillar数据
在pillar目录中,创建一个名为security.saltminion1.sls
的文件,用于存储saltminion1.local
服务器的设置。以下是一个示例security.saltminion1.sls
文件:
security:
options:
allow_httpd: True
这个文件中设置了allow_httpd
为True
,表示saltminion1.local
服务器可以运行httpd服务。
经过以上的修正和配置,用户就能够根据pillar中的设置来控制是否在特定的服务器上运行httpd服务了。
Debugging建议
如果用户在使用过程中遇到问题,可以使用这个jinja2模板引擎在线工具来帮助调试。同时,还要注意Python中的"True"
是一个关键字,可能会被解释为布尔类型,而不是字符串。在这种情况下,不需要将allow_httpd
判断为字符串,直接使用if allow_httpd
来判断布尔值即可。
修正上述问题后,用户就能够根据pillar的设置,在特定的服务器上控制httpd服务的运行与否了。
请记得在操作前备份相关文件,根据具体情况可能需要适当调整。