我有一台服务器pmaster-dev这是一个傀儡客户端(它的主人是主控)。 服务器pmaster-dev它本身就是多个客户的傀儡大师。
什么时候pmaster-dev与...联系主控它会将信息缓存到本地 sqlite3 数据库文件中/var/lib/puppet/state/clientconfigs.sqlite
。每次后续签到时pmaster-dev永远不会更新此本地缓存。因此,其事实始终是陈旧的。主控(包括主控本身)从不缓存。
我们如何告诉它更新缓存或禁用事实缓存?为什么它缓存了,而其他客户端主控不是?
我们在 Debian squeeze 系统上运行 2.7.18。
这/etc/puppet/puppet.conf
是pmaster-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 而不是客户端维护的文件。
它的创建由部分中的storeconfigs
、async_storeconfigs
和参数控制。默认(未设置任何参数时)使用 SQLite 适配器。db*
[master]
puppet.conf
db*
从您粘贴的配置来看,您似乎已将主服务器配置为通过 Stomp 代理将配置存储在 MySQL 数据库中。因此,似乎不更新 SQLite 数据库是设计使然?
为什么要创建这个数据库文件是一个好问题。我的假设是,在服务器的初始设置过程中,Puppet Master 的配置不完整。