我正在尝试使用版本控制来设置我们的环境。我们的 shell 脚本分散在不同的服务器上。我不知道我必须从哪里开始组织它才能对其进行版本控制。但是,我们也使用 puppet 进行配置管理,它也应该具有版本控制。我有以下 2 个问题,我不确定它们是否至少可行:
- 有没有办法对脚本进行版本控制,将它们留在现在的位置,因为大多数脚本都是特定于服务器的。
- 是否有任何常见的解决方案可以对傀儡模块和 shell 脚本使用版本控制,或者将脚本放在傀儡中并且仅将版本控制傀儡中。
提前谢谢。
tl;dr:
- 有没有办法对脚本进行版本控制,将它们留在现在的位置,因为大多数脚本都是特定于服务器的?
- 是否有任何常见的解决方案可以对傀儡模块和 shell 脚本使用版本控制,或者将脚本放在傀儡中并且仅将版本控制傀儡中。
这是可能的,但如果你编写你的Puppet代码来处理你的要求,这是不必要的。
通常,当您开始使用像Puppet这样的配置管理工具时,您这样做是为了摆脱管理脚本。Puppet 是一种无需编写任何脚本即可运行命令的方式,并将运行的实际步骤抽象到 Puppet 并让它处理它。
使用 Puppet运行现有脚本通常是一种临时情况,您希望最终重构为使用 Puppet execs,然后是更幂等的 Puppet 模块和清单,直到最终本机 Puppet 代码满足所有要求,因此更改完全由 puppet 管理。
有关为什么要这样做的详细信息,请参阅此问题:https://serverfault.com/questions/504070/why-use-chef-puppet-over-shell-scripts
例如,假设您在Web服务器上使用脚本来安装软件包:
Note: Steps simplified for examples, code might not actually work
脚本示例:
#/bin/bash
if $HOSTNAME='webserver.example'
yum install nginx
fi
这位于/var/tmp/install_nginx.sh
首先,您可以使用Puppet运行它:
exec {'/var/tmp/install_nginx.sh':}
但是,我们如何首先获得该脚本?你可以把它放在版本控制中,但是你如何设置它呢?
即使你让它工作,这也有点繁琐:如果网络服务器的名称发生变化怎么办,如果你想在多个服务器上使用它怎么办?
然后你可以用Puppet本身创建脚本:
$webserver_host = 'webserver.example'
$nginx_install_script = "if $HOSTNAME=${webserver.example}
yum install nginx
fi"
exec {'Install Nginx':
command => $nginx_install_script
}
因此,如果您需要更改Web服务器名称,则可以更改变量。
但这仍然不是幂等的。Puppet具有本机类型,可以减少很多工作(在此处记录,或者您可以编写自己的工作)
因此,您可以更改该代码以使其更好:
$webserver_host = 'webserver.example'
if $::fqdn == webserver_host {
package {'nginx':
ensure => 'present',
}
}
这是幂等的,它是独立于平台的。
这种重构从这里继续。