问题描述
在一个共享的 Web 服务器上有多个网站,每个网站都有一个专用的用户作为所有者,并且所属组为 apache。用户想要在服务器上安装 Jenkins 节点,但是如何使其能够更改文件并运行像 git pull
这样的命令呢?用户认为使用 runuser
不是一个好方法。他的 Jenkins 脚本将主要执行 git pull
、drush
命令(用于 Drupal 网站)、从远程服务器进行 rsync 等操作。用户还需要在最后运行 chmod
和 chown
命令,但对于这些命令,他可能会使用 sudoers
文件。感谢提供帮助。
解决方案
请注意以下操作可能因版本差异或存在风险,确保在执行前备份数据。
在这种情况下,您可以考虑使用一种基于文件的“消息”交换方案,建立一个“邮箱” – 一个已知的文件系统位置,用于在不同的用户之间传递部署请求和处理结果。以下是基本的实现步骤:
- 首先,创建两个目录:一个目录用于存放请求文件,另一个目录用于存放响应文件。这两个目录都需要设置正确的所有者和权限。
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
- 创建一个 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 脚本中通过执行这个脚本来发送部署请求,然后不同的用户(网站所有者)可以定期运行这个脚本来处理请求并提供响应。
- 通过运行脚本来发送部署请求,示例:
./mailbox.py -c deploy -i 20 -u dancorn -a artifact
这会向特定用户发送一个部署请求,其中 -i
参数是部署请求的 ID,-u
参数是部署请求的用户,-a
参数是部署的内容(例如 artifact
)。这个脚本会创建一个请求文件,然后等待相应的用户来处理请求并提供响应。
- 定期运行脚本来处理部署请求和提供响应,示例:
./mailbox.py -c handler
这会定期检查请求文件,然后处理请求并创建响应文件,最后清理掉请求和响应文件。
请注意,这个方案虽然不是实时的,但对于典型的持续集成流程来说,处理时间通常在一分钟之内,因此不会有太大的延迟。此外,这个方案的优点在于它很简单且不涉及额外的安全性风险。
总结
在共享的 Web 服务器上安装 Jenkins 节点并设置正确的权限可能需要处理不同用户的部署请求和响应。使用基于文件的“消息”交换方案可以简化这个过程,虽然不是实时的,但适用于大多数持续集成流程。通过创建请求文件和响应文件,不同用户可以在不同时间处理请求,并提供响应,从而达到了一种分布式处理的目的。