4

问题: 在我的环境中运行 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:由于我们运行的是一个与互联网断开连接的机密环境,因此上传日志文件是一个非常复杂的过程。

4

0 回答 0