Salt – 如何根据pillar检查并执行if/else判断

56次阅读
没有评论

问题描述

在使用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_httpdTrue,表示saltminion1.local服务器可以运行httpd服务。

经过以上的修正和配置,用户就能够根据pillar中的设置来控制是否在特定的服务器上运行httpd服务了。

Debugging建议

如果用户在使用过程中遇到问题,可以使用这个jinja2模板引擎在线工具来帮助调试。同时,还要注意Python中的"True"是一个关键字,可能会被解释为布尔类型,而不是字符串。在这种情况下,不需要将allow_httpd判断为字符串,直接使用if allow_httpd来判断布尔值即可。

修正上述问题后,用户就能够根据pillar的设置,在特定的服务器上控制httpd服务的运行与否了。

请记得在操作前备份相关文件,根据具体情况可能需要适当调整。

正文完