我正在尝试部署Redmine服务器。安装过程使用 Bundle 安装其依赖项。交互安装时,sudo
如果 Bundle 需要安装一些系统范围的库,会提示用户输入密码。不建议以 root 身份安装 Redmine。
我使用 Ubuntu 14.04 64 位。它puppet
是从 LXC 非特权容器内部运行的。
我曾经有过一种解决方法,即/var/lib/sudo
在安装 Bundle 之前接触相应的文件。这是很不靠谱的,在最近的 sudo 升级后就失效了。
还有其他方法吗?或者也许 sudo 确实允许以非交互方式授予宽限期,而我只是错过了?
我的sudoers
文件已经包含该Defaults !tty_tickets
条目。我宁愿没有它,但如果没有这行,我认为解决问题的希望就更小了。
这是我的forcesudo
资源:
define forcesudo ($user = $name, $notify = $notify) {
file { "/etc/sudoers.d/fix-${user}": content => "${user} ALL = (root) NOPASSWD: ALL\n" }
file { "/etc/sudoers.d/tty_tickets": content => "Defaults !tty_tickets\n" }
file { "/var/lib/sudo/${user}":
ensure => directory,
owner => 'root',
mode => 700,
group => $user
}
file { "/var/lib/sudo/${user}/0":
content => '',
owner => 'root',
mode => 0600,
group => $user
}
touch { "/var/lib/sudo/${user}":
notify => $notify,
require => File["/var/lib/sudo/${user}"]
}
touch { "/var/lib/sudo/${user}/0":
notify => $notify,
require => File["/var/lib/sudo/${user}"]
}
}
资源如下touch
:
define touch ($user = "root", $group = "root", $notify = $notify) {
exec { "touch ${name}":
command => "/usr/bin/touch ${name}",
user => $user,
group => $group,
notify => $notify,
refreshonly => true,
}
}
编辑:
可以通过以 root 身份运行 Bundle 来绕过此问题,尽管 Bundle 不鼓励这样做:Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
这是https://github.com/johanek/johanek-redmine傀儡模块。
由于这只是一种解决方法,而不是解决方案,因此问题仍然存在。
答案1
更新:
您是否尝试过使用 puppet 模块来实现这一点?至少有一声称可以安装 redmine。更改它以满足您的需求可能会更容易。
您实际上并没有告诉我们如何通过 puppet 启动 redmine 安装。
尝试将其添加到您的 sudoers.d 文件中:
Defaults:username !requiretty
启动 redmine 安装的用户无需拥有 tty。也不应该出现密码提示。
如果 sudo 仍然提示输入密码,那么 redmine 安装程序调用 sudo 的方式就有问题。
至于您的安全担忧:
最佳做法是使用包(RPM、DEB 等),即使您必须自己创建它。
安装完成后,设置 puppet 来删除临时授予的 sudo 权限就足够了。