脚本和木偶的版本控制

version control for scripts and puppet

我正在尝试使用版本控制来设置我们的环境。我们的 shell 脚本分散在不同的服务器上。我不知道我必须从哪里开始组织它以对其进行版本控制。然而,我们也使用 puppet 进行配置管理,它也应该有版本控制。我有以下 2 个问题,我不确定它们是否可能至少:

  1. 有没有办法对脚本进行版本控制,让它们留在现在的位置,因为大多数脚本都是特定于服务器的。
  2. 是否有任何通用的解决方案来对 puppet 模块和 shell 脚本使用版本控制,或者将脚本放在 puppet 中并且仅对 puppet 进行版本控制。

提前致谢。

tl;博士:

  1. Is there a way to have version control on the scripts leaving them in the location whatever they are right now as most the scripts are server specific?
  2. Is there any common solution to use version control for puppet modules and shell scripts or put the scripts in puppet and only version control puppet.

这是可能的,但如果您编写 Puppet 代码来处理您的要求,则没有必要。

通常,当您开始使用像 Puppet 这样的配置管理工具时,您这样做是为了摆脱管理脚本。 Puppet 是一种 运行 在不编写任何脚本的情况下执行命令,并将实际步骤抽象为 运行 Puppet 并让它处理的方法。

将 Puppet 用于 运行 现有脚本通常是一种临时情况,您希望最终重构为使用 Puppet exec,然后使用更多幂等 Puppet 模块和清单,直到最终所有要求都由原生 Puppet 代码满足, 因此更改完全由 puppet 管理。

有关为什么要这样做的更多信息,请参阅此问题:https://serverfault.com/questions/504070/why-use-chef-puppet-over-shell-scripts

例如,如果您在网络服务器上,假设您从一个脚本开始安装软件包:

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
}

因此,如果您需要更改网络服务器名称,只需更改变量即可。

但这仍然不是幂等的。 Puppet 具有原生类型,可以完成大量工作(Documented here 或者您可以编写自己的类型)

因此您可以更改该代码以使其变得更好:

$webserver_host = 'webserver.example'

if $::fqdn == webserver_host {
  package {'nginx':
     ensure => 'present',
  }
}

这更幂等,它与平台无关。

此重构从这里继续。