Puppet 客户端缓存但不更新本地事实

Puppet 客户端缓存但不更新本地事实

我有一台服务器pmaster-dev这是一个傀儡客户端(它的主人是主控)。 服务器pmaster-dev它本身就是多个客户的傀儡大师。

什么时候pmaster-dev与...联系主控它会将信息缓存到本地 sqlite3 数据库文件中/var/lib/puppet/state/clientconfigs.sqlite。每次后续签到时pmaster-dev永远不会更新此本地缓存。因此,其事实始终是陈旧的。主控(包括主控本身)从不缓存。

我们如何告诉它更新缓存或禁用事实缓存?为什么它缓存了,而其他客户端主控不是?

我们在 Debian squeeze 系统上运行 2.7.18。

/etc/puppet/puppet.confpmaster-dev

[agent]
server = pmaster.example.org
environment = master
configtimeout = 300

logdir = /var/log/puppet
vardir = /var/lib/puppet
ssldir = /etc/puppet/ssl
rundir = /var/run/puppet

ca_server = puppetca.example.org
ca_port = 8141

graph = true
report = true
pluginsync = true

classfile = $vardir/classes.txt
localconfig = $vardir/localconfig
diff_args = '-u'
show_diff = true


[master]
certname = pmaster-dev.example.org
syslogfacility = local2

logdir = /var/log/puppet
vardir = /var/lib/puppet
rundir = /var/run/puppet
ssldir = /srv/puppetmaster/ssl

reports = tagmail,lastcheck,logcache
manifest = /srv/puppet/$environment/manifests/site.pp
graph = true
modulepath = /srv/puppet/$environment/modules:/srv/puppet/$environment/services:/srv/puppet/$environment/clients
cacrl = /srv/puppetmaster/ssl/crl.pem
ca = false

manifestdir = /srv/puppet/$environment/manifests
queue_source = stomp://pupqueue-dev.example.org:61613/
async_storeconfigs = true
storeconfigs = false
dbadapter = mysql
dbuser = puppet
dbpassword = secret
dbserver = pupqueue-dev.example.org
dbname = puppet

ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

答案1

在对 Puppet Ruby 源文件进行一番挖掘后,我将问题追溯到一个错误,即 Puppet 配置文件部分存在混淆。这一切都归结为“master”这个词

概括:Puppet Master 在充当 Puppet 客户端并处于“主”环境中时会导致配置文件解析问题。

细节:当 Puppet 代理启动时,它所做的事情之一就是解析配置文件(通常/etc/puppet/puppet.conf)。

配置文件被分成几个部分,例如“[main]”、“[agent]”、“[master]”等。每个部分都单独存储在解析配置文件生成的哈希中。在我的例子中,pmaster-dev包含以下部分:“memory”、“master”、“cli”和“agent”。

还可以有每个环境的部分。例如,如果有一个名为“stable201301”的环境,那么配置文件中可以有一个名为“[stable201301]”的部分。

对于上述每个部分(在代码中称为“源”),您需要检查所有具有相关“钩子”的设置。如果在该部分中定义了带有钩子的设置,则调用该设置的钩子。一些具有钩子的设置包括 catalog_format、node_name_fact 和 storeconfigs。

其中一个更有趣的设置是“async_storeconfigs”,它有一个设置缓存类的钩子。

回想一下,这些部分还可以包括每个环境的部分。问题:如果 Puppet 主机(当充当 Puppet 客户端时)处于“主机”环境中,该怎么办?

“[master]” 部分通常用于设置 Puppet 主控。但如果 Puppet 主控本身正在使用“主控”环境,则会发生冲突。具体而言,“[master]” 中的“async_storeconfigs”设置会从配置文件中加载。由于 Puppet 主控(作为 Puppet 客户端)位于“主控”环境中,因此此设置会导致设置缓存类,因此puppet agent --test运行时,puppet 客户端会查找缓存的事实。

解决方案(?):您可以确保 Puppet 主服务器从不使用“主服务器”环境。更好的解决方案是让客户端配置解析器不查看“[master]”部分(因为这仅适用于 Puppet 主服务器)。更好的解决方案是将客户端和主服务器配置文件完全分开。

答案2

看起来你对clientconfigs.sqlite实际情况感到困惑。此文件是已存储的配置Puppet 机制。它是由 Puppet Master 而不是客户端维护的文件。

它的创建由部分中的storeconfigsasync_storeconfigs和参数控制。默认(未设置任何参数时)使用 SQLite 适配器。db*[master]puppet.confdb*

从您粘贴的配置来看,您似乎已将主服务器配置为通过 Stomp 代理将配置存储在 MySQL 数据库中。因此,似乎不更新 SQLite 数据库是设计使然?

为什么要创建这个数据库文件是一个好问题。我的假设是,在服务器的初始设置过程中,Puppet Master 的配置不完整。

相关内容