问题: 在我的环境中运行 puppet 代理的服务器正在接收空的 [classes](没有参数),而不是存储在其 Hiera 文档中的预期参数。这会导致 puppet 模块使用空参数运行,进而导致它们使用默认值而不是实际的预期值成功运行(这显然是不希望的和破坏性的行为)。
是什么导致问题触发? 我们的 Hiera 基于 CouchDB 文档数据库(稍后我将进一步扩展)。当 CouchDB 服务关闭时,puppet 代理(在向 puppet-masters 询问新目录时)收到空的 [classes](不带参数),而不是存储在其 Hiera 文档中的预期参数。
我的环境架构:
- NetworkLoadBalancer (Cisco Ace) 下的 4 个 Puppet 主服务器
- 1个傀儡CA服务器
- NetworkLoadBalancer (Cisco Ace) 后面的 2 个 Hiera 服务器 (couchDB 1.6.0)
- 所有服务器操作系统都是 RedHat 6.3
- 木偶版 3.7.4
- Puppet master 使用Http_Backend v1.0.1与 hiera 服务器通信
- 使用 puppetDB 和 postgress sql 来保存服务器库存
我们如何模拟这个问题?
通过停止 Hiera 服务器上的 CouchDB 服务 - hiera01(只是两者之一),我们能够触发问题。
puppet-masters 日志显示已对 hiera01 服务器打开超过 20 分钟的会话的“连接被拒绝...”错误
停止 couchdb 服务时会话未关闭。
新请求被路由到 hiera02。
客户端服务器,他们的会话通过 hiera01 从 master 获取目录 - 获得了他们的类的默认参数!
Puppet master的主配置文件
[main]
logdir = /var/log/puppet
rundir = /var/run/puppet
ssldir = %vardir/ssl {group = service, mode = 640}
ca = false
certname = master_server_01.domain
dns_alt_names = puppet-master-ace.domain, puppet-master-ace
use_srv_records = true
pluginsource = puppet:///plugins
pluginfactsource = puppet:///pluginfacts
reports = log, foreman
enviromentpath = $confdir/enviroments
basemodulepath = $confdir/modules
[agent]
classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
[master]
storeconfigs = true
storeconfigs_backend = puppetdb
always_cache_features = true
Hiera.yaml(主服务器)
---
:backends:
- http
- yaml
:hierarchy:
- "%{fqdn}"
- "%{enviroment}"
- common
:http:
:host: hieraserverace.domain
:use_auth: true
:auth_user: admin
:auth_pass: Passowrd
:api_user: apiUser
:api_pass: apipassword
:merge_behavior: deeper
:port: 5984
:output: json
:failure: graceful
:path:
- "/%{environment}/%{fqdn}"
- "/%{environment}/%{osfamily}"
- "/%{environment}/%{enviroment}"
- "/%{environment}/common"
:yaml:
:datadir: /etc/puppet/hieradata
笔记
- 环境是产品,更新版本几乎是不可能的。
- hieradata 目录为空(不使用 yaml 后端)
谢谢 !
PS:由于我们运行的是一个与互联网断开连接的机密环境,因此上传日志文件是一个非常复杂的过程。