在共享的 Web 服务器上安装 Jenkins 节点并设置正确的权限

47次阅读
没有评论

问题描述

在一个共享的 Web 服务器上有多个网站,每个网站都有一个专用的用户作为所有者,并且所属组为 apache。用户想要在服务器上安装 Jenkins 节点,但是如何使其能够更改文件并运行像 git pull 这样的命令呢?用户认为使用 runuser 不是一个好方法。他的 Jenkins 脚本将主要执行 git pulldrush 命令(用于 Drupal 网站)、从远程服务器进行 rsync 等操作。用户还需要在最后运行 chmodchown 命令,但对于这些命令,他可能会使用 sudoers 文件。感谢提供帮助。

解决方案

请注意以下操作可能因版本差异或存在风险,确保在执行前备份数据。

在这种情况下,您可以考虑使用一种基于文件的“消息”交换方案,建立一个“邮箱” – 一个已知的文件系统位置,用于在不同的用户之间传递部署请求和处理结果。以下是基本的实现步骤:

  1. 首先,创建两个目录:一个目录用于存放请求文件,另一个目录用于存放响应文件。这两个目录都需要设置正确的所有者和权限。
sudo mkdir -p /var/message_box/requests
sudo chown jenkins /var/message_box/requests
sudo chmod go-w /var/message_box/requests

sudo mkdir /var/message_box/responses
sudo chgrp apache /var/message_box/responses
sudo chmod g+w /var/message_box/responses
  1. 创建一个 Python 脚本,称之为 mailbox.py,用于处理部署请求和响应。
#!/usr/bin/python2.7 -u
import logging, os, re, getpass, sys, time, yaml

class Mailbox(object):
    base_dir = '/var/message_box'
    request_filename_format = '%s.%s.yaml'  # username.id.yaml

    # 省略其他方法...

if __name__ == "__main__":
    import optparse
    logging.basicConfig(level=logging.DEBUG, format="%(levelname)5s  %(asctime)s %(filename)s:%(lineno)d] %(message)s")
    os.umask(022)
    p = optparse.OptionParser()
    p.add_option('-c', '--command', action='store', dest='command', choices=['deploy', 'handler'],
                 help='command/mode: <deploy|handler>, mandatory', default=None)
    # 添加其他选项...

    opts, _ = p.parse_args()

    mailbox = Mailbox()

    if opts.command == 'deploy':
        # 处理部署请求...
    elif opts.command == 'handler':
        # 处理响应...

这个脚本使用一个简单的“邮箱”概念来处理部署请求和响应。用户可以在 Jenkins 脚本中通过执行这个脚本来发送部署请求,然后不同的用户(网站所有者)可以定期运行这个脚本来处理请求并提供响应。

  1. 通过运行脚本来发送部署请求,示例:
./mailbox.py -c deploy -i 20 -u dancorn -a artifact

这会向特定用户发送一个部署请求,其中 -i 参数是部署请求的 ID,-u 参数是部署请求的用户,-a 参数是部署的内容(例如 artifact)。这个脚本会创建一个请求文件,然后等待相应的用户来处理请求并提供响应。

  1. 定期运行脚本来处理部署请求和提供响应,示例:
./mailbox.py -c handler

这会定期检查请求文件,然后处理请求并创建响应文件,最后清理掉请求和响应文件。

请注意,这个方案虽然不是实时的,但对于典型的持续集成流程来说,处理时间通常在一分钟之内,因此不会有太大的延迟。此外,这个方案的优点在于它很简单且不涉及额外的安全性风险。

总结

在共享的 Web 服务器上安装 Jenkins 节点并设置正确的权限可能需要处理不同用户的部署请求和响应。使用基于文件的“消息”交换方案可以简化这个过程,虽然不是实时的,但适用于大多数持续集成流程。通过创建请求文件和响应文件,不同用户可以在不同时间处理请求,并提供响应,从而达到了一种分布式处理的目的。

正文完