在Jenkins中使用SaltStack为服务器分配pillar值

54次阅读
没有评论

问题描述

在Jenkins中有一个作业,作业的字符串参数为目标服务器列表,例如”server1,server2″。Jenkins的流水线脚本应该在server1和server2上分别执行该作业。有一个通用的Salt SLS文件,用于在这两个服务器上更新目录权限和组。期望的是,当在server1上执行作业时,必须创建并更新一个名为”xx-server1-yy”的组,同样,在server2上创建一个名为”xx-server2-yy”的组。这意味着需要一个在多台服务器上执行Jenkins作业的Salt SLS文件,并针对每台服务器分别创建特定的组。请问最佳的解决方案是什么?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1: 通过命令行传递pillar值

一种方法是通过命令行传递pillar值来执行Salt SLS文件。你可以在Jenkins脚本中使用salt '*' state.apply命令,并通过pillar参数传递所需的pillar值。
以下是使用该方法的步骤:

  1. 编写一个包含目录权限和组更新的Salt SLS文件,可以根据pillar值来创建特定的组。
  2. 在Jenkins流水线脚本中,使用salt '*' state.apply命令执行Salt SLS文件,并通过pillar参数传递服务器特定的pillar值。
    示例:
// Jenkins流水线脚本
node {
    def targetServers = "server1,server2" // 从Jenkins参数获取目标服务器列表
    def pillarValues = [
        server1: ["group_name": "xx-server1-yy"],
        server2: ["group_name": "xx-server2-yy"]
    ]

    targetServers.split(',').each { server ->
        // 执行Salt SLS文件并传递pillar值
        sh "salt '${server}' state.apply your_sls_file pillar='${pillarValues[server]}'"
    }
}

方案2: 事先将组名作为grain设置到minion中

另一种方法是在minion上事先设置组名作为grain值。这样,在Salt SLS文件中可以直接引用这个grain来创建特定的组。

  1. 在每台服务器的Salt minion配置中,设置一个自定义的grain,表示服务器的组名。
  2. 在Salt SLS文件中,根据服务器的grain值来创建特定的组。
    示例:
# Salt SLS文件
{% set group_name = salt['grains.get']('group_name') %}
{% if group_name %}
create_group_{{ group_name }}:
  group.present:
    - name: {{ group_name }}
{% endif %}

方案3: 使用主机名grain在SLS公式中设置组名

还有一种方法是在Salt SLS公式中根据主机名grain来设置组名。假设主机名已经设置并标准化。

  1. 在Salt SLS文件中,使用Jinja变量根据主机名grain来设置特定的组名。
  2. 确保主机名在minion上已经正确设置。
    示例:
# Salt SLS文件
{% set group_name = salt['grains.get']('host') | replace('-', '_') %}
create_group_{{ group_name }}:
  group.present:
    - name: {{ group_name }}

这些方案都可以根据你的具体需求选择,确保根据服务器的不同情况创建特定的组。根据你的实际情况和偏好,选择适合你的方法。

正文完