0

我正在使用 puppet 从 facter 中读取事实,并基于此将不同的配置应用于我的模块。

问题:

傀儡特工没有看到这个事实。以交互方式运行puppet agent --test按预期工作。即使从脚本以非交互方式运行它似乎也可以正常工作。只有代理本身在搞砸。

过程:

我正在 EC2 上部署一个基于 Ubuntu 的应用程序堆栈。使用 userdata (#cloud-config),我在 /etc/environment 中设置了一个环境变量:

export FACTER_tl_role=development

然后立即在#cloud-config 中,我获取/etc/environment。只有那么我 apt-get install puppet (我不再使用 package: puppet 来消除#cloud-config 步骤序列中的歧义)

实例启动后,我确认事实可用:运行facter tl_role返回“开发”。然后我检查 /var/log/syslog,显然 puppet 代理没有看到这个事实 - 我知道这一点是因为它无法编译目录,并且没有任何(空白)我应该看到的值变量集取决于这个事实。

但是,puppet agent --test交互式运行可以很好地编译和运行目录。即使从#cloud-config 脚本(安装puppet 后立即)运行它也可以正常工作。

我如何让 puppet 代理了解这个事实?重新启动代理服务没有任何区别,它仍然不知道自定义事实。重新启动实例也没有任何区别。

这是一些代码:

EC2 用户数据:

#cloud-config

puppet:
  conf:
    agent:
      server: "puppet.foo.bar"
      certname: "%i.%f"
      report: "true"

runcmd:
- sleep 20
- echo 'export FACTER_tl_role=development' >> /etc/environment
- . /etc/environment
- apt-get install puppet
- puppet agent --test

主要木偶清单:

# /etc/puppet/manifests/site.pp
node default {
case $tl_role {
    'development':  { $sitedomain = "dev.foo.bar"}
    'production':   { $sitedomain = "new.foo.bar"}
}
class {"code" : sitedomain => $sitedomain}
class {"apache::site" : sitedomain => $sitedomain}
class {"nodejs::grunt-daemon" : sitedomain => $sitedomain}

然后我看到 $sitedomain 应该是失败的地方,所以 $tl_role 似乎没有设置。

有任何想法吗?这让我脑洞大开……

4

3 回答 3

5

另一个简单的选择是将事实放入外部事实中。

将文件放入 /etc/facter/facts.d/* 相当容易,您可以使用文本文件、yaml json 或可执行文件来完成。

http://docs.puppetlabs.com/guides/custom_facts.html#external-facts

*这是在开源木偶上,在 unix-y 机器上。查看完整文档的链接。

于 2013-10-09T16:23:04.307 回答
3

谢谢你,@克里斯托弗。这可能是一个很好的解决方案,我会对其进行测试,并可能从我目前可怕的 hack 中转移到它。我在 Puppet Users Google Group 中得到的答案是,我不应该假设 Puppet 代理进程将具有登录 shell 的环境,并且当 Puppet 代理运行时,Facter 也将具有此环境。

这是我解决它的方法(诚然,通过蛮力):

runcmd:
- echo 'export FACTER_tl_role=development' >> /etc/environment
- . /etc/environment
- apt-get install puppet
- service puppet stop
- sed -i '/init-functions/a\. \/etc\/environment' /etc/init.d/puppet
- puppet agent --test
- service puppet start

如您所见,安装 Puppet 后,我​​停止代理,并在 /etc/init.d/puppet 中添加一行到源 /etc/environment。然后我启动代理。不理想......但它的工作原理!

于 2013-03-20T14:39:20.710 回答
1

我认为不会. /etc/environment像 cloud-init 那样正常工作runcmd。两种可能的解决方案:

  • 使用 puppet agent 命令导出变量:

    export FACTER_tl_role=development && puppet agent --test

如果这不起作用:

  • 只需将命令放入用户数据脚本并将它们连接在一起作为“多部分输入”(在cloud-init 文档中描述)。

第二种解决方案将命令作为适当的 shell 脚本执行,并且可能会解决问题。但是,如果第一个有效,那么使用您所拥有的就更容易了。

于 2013-02-26T23:02:36.370 回答