我试图确定 Puppet 认为我的代理节点上的环境是什么。每文档我在配置代理的环境/etc/puppet/puppet.conf这样
[agent]
environment = development
Run Code Online (Sandbox Code Playgroud)
为了查看环境,我发现此代码将环境事实添加到因子:
require 'puppet'
Facter.add("environment") do
setcode do
Puppet[:environment]
end
end
Run Code Online (Sandbox Code Playgroud)
但是,在我的一个代理节点上,如果我运行sudo facter -p environment
,结果是production。我尝试通过 临时手动设置环境sudo puppet agent --environment development
,但是 factorer 的结果是相同的。
知道发生了什么吗?
快速简介 - 出于测试目的,我在 5 个节点(Debian Squeeze + puppet 2.7.20-1puppetlabs1)上安装了 puppet 代理,并在 1 个服务器(相同版本)上安装了 puppet master。
在每个清单的 puppetmaster 端,我检查是否 $::osfamily == 'Debian'。有时我也使用 $::fqdn,并检查它是否不为空。
问题是每天随机时间我都会收到来自 puppetmaster 的邮件,说他无法为其中一个节点编译目录。例如:
Fri Jan 18 19:18:24 +0100 2013 Puppet (err): Could not retrieve catalog from remote server: Error 400 on SERVER: Not supported osfamily at /etc/puppet/modules/system/manifests/skel.pp:20 on node mynodeX
Fri Jan 18 19:18:24 +0100 2013 Puppet (notice): Using cached catalog
Fri Jan 18 19:18:24 +0100 2013 Puppet (err): Could not retrieve catalog; skipping run
Run Code Online (Sandbox Code Playgroud)
另一个例子,来自 puppetmaster 日志: …
您将如何使用 factor 和 puppet 来确定操作系统是运行 Cent 6.x 还是 Cent 5.x ?
facter operatingsystemrelease
6.4
Run Code Online (Sandbox Code Playgroud)
我只关心主要版本(6)
我已经考虑过使用 awk,但必须有更好的方法对“傀儡清单”更友好。
#This works, but is ugly trying to use this in a puppet manifest
facter operatingsystemrelease |awk -F. '{print $1}'
6
Run Code Online (Sandbox Code Playgroud)
更新:
看起来新版本的 facter 有一些关于主要版本的附加信息,这些信息不在我的版本中。我的初始配置需要假设因子已过时。
facter --version
1.6.4
puppet --version
2.7.20
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下命令搜索可能显示主要版本的任何其他事实
facter |grep 6
Run Code Online (Sandbox Code Playgroud) 在事实 2 中,您现在可以将数组/哈希作为事实。
例如:
os => {
"name"=>"CentOS",
"family"=>"RedHat",
"release"=>{
"major"=>"7",
"minor"=>"0",
"full"=>"7.0.1406"
}
}
Run Code Online (Sandbox Code Playgroud)
os=>release=>major
从清单访问的格式是什么?
我正在运行一个 masterless puppet 设置,它以以下方式应用 puppet 更改。
puppet apply /tmp/puppet/manifests/site.pp --modulepath=/tmp/puppet/modules --hiera_config=/tmp/puppet/hiera.yaml
Run Code Online (Sandbox Code Playgroud)
我一直在尝试在 hiera 中处理我们拥有的不同类型的节点,并且作为起点,我一直在尝试使用在节点上设置的自定义事实。这个事实是节点类型,在这个例子中被设置为无盘值。
节点上的因素认识到这一事实。
# facter -y | grep nodetype
nodetype: diskless
Run Code Online (Sandbox Code Playgroud)
并且 hiera.yaml 包含以下内容
---
:backends:
- yaml
:yaml:
:datadir: /tmp/puppet/data
:hierarchy:
- node/%{::nodetype}
Run Code Online (Sandbox Code Playgroud)
在 /tmp/puppet/data/node/diskless.yaml 有
---
cluster: blues
Run Code Online (Sandbox Code Playgroud)
虽然这样做之后我尝试仔细检查 hiera 然后根据需要设置变量,但它似乎不起作用。
hiera -y diskless.yaml cluster
nil
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来调试问题。我相信这很简单,但如果 hiera 不能(或不能)在这个用例中运行会令人失望。
干杯
编辑1:
附加调试
hiera cluster '::nodetype=diskless' -d
DEBUG: Fri Oct 31 16:54:01 -0400 2014: Hiera YAML backend starting
DEBUG: Fri Oct 31 16:54:01 -0400 2014: Looking up …
Run Code Online (Sandbox Code Playgroud) 我不是一个 Ruby 人,但找到了如何列出 Ruby 加载路径。这就是我的样子
$ ruby -e 'puts $:'
/usr/lib/ruby/site_ruby/1.8
/usr/lib64/ruby/site_ruby/1.8
/usr/lib64/ruby/site_ruby/1.8/x86_64-linux
/usr/lib/ruby/site_ruby
/usr/lib64/ruby/site_ruby
/usr/lib64/site_ruby/1.8
/usr/lib64/site_ruby/1.8/x86_64-linux
/usr/lib64/site_ruby
/usr/lib/ruby/1.8
/usr/lib64/ruby/1.8
/usr/lib64/ruby/1.8/x86_64-linux
Run Code Online (Sandbox Code Playgroud)
其中一些目录甚至不存在,坦率地说,我认为自定义事实.rb文件最好放置在 Puppet-ish 位置,例如/etc/puppet/facts或类似位置。
我应该使用现有的加载路径位置之一还是为了 Puppet 的目的创建一个新的?
在当前版本的 Puppet 和 Facter 中,我得到了相同的信息lsbdistid
和operatingsystem
事实——我不看,osfamily
因为在 Gentoo Linux 上它报告一个通用的“Linux”字符串。
在 Puppet 模块中使用该信息时(例如,用于选择要安装的软件包名称)是否有任何技术原因或已建立的共识来使用lsbdistid
或operatingsystem
?
尝试设置自定义订阅以使 remediator.rb 在 puppet 的 sensu 模块中工作。
类 sensuJenkinsMasterClient { 类{'感': purge_config => 真, rabbitmq_password => '', rabbitmq_host => 'sensu-master', #Need for remediator 需要 fqdn 订阅 => ['sensu-default', 'centosJenkinsMaster', '"${::fqdn}'], use_embedded_ruby => true, #set 下 /etc/default/sensu } }