我正在学习 puppet 并尝试在家里的 VM 上试验它。我还没有使用 puppet 服务器,只是在本地运行。它工作正常,但每次我运行 puppet apply ... 时,我都会延迟几秒钟,之后它会显示消息

warning: Could not retrieve fact fqdn

我假设该消息与延迟有关,我想摆脱它(延迟——我可以接受消息)。谷歌搜索解决方案似乎表明它与 DNS 查找有某种关系,但我真的找不到关于它的任何其他信息,这似乎令人惊讶。我想要的只是能够在我的 vm 中快速应用 list ,以便我可以进行实验。我怎样才能加快速度?

更新: 我在调试输出中没有看到任何额外信息,但它看起来像这样:
$ puppet apply -dv puppet-1.pp
warning: Could not retrieve fact fqdn
debug: Failed to load library 'rubygems' for feature 'rubygems'
debug: Failed to load library 'selinux' for feature 'selinux'
debug: Puppet::Type::File::ProviderMicrosoft_windows: feature microsoft_windows is missing
...

更新: 我添加了“ruby”标签,因为 puppet 的追随者太少了。如果这不属于 ruby​​,或者您知道更好的标签,请告诉我。

再次更新: 了解了有关 puppet 的更多信息后,我现在明白此消息来自名为“Facter”的组件,该组件嗅探出有关运行 Puppet 的系统的“事实”。我找到了一些配置选项并尝试了 "certname""node_name""node_name_value" ,但我无法让延迟消失。有谁知道如何告诉 Facter 忽略 fqdn 或如何让 Facter 能够在 Ubuntu 11.10 虚拟机上找到 fqdn?

进度:
$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1

那是我的路由器,它通过 Tomato 运行 Dnsmasq。
$ dig -x 192.168.1.129 192.168.1.1

; <<>> DiG 9.7.3 <<>> -x 192.168.1.129 192.168.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21838
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;129.1.168.192.in-addr.arpa.    IN  PTR

;; ANSWER SECTION:
129.1.168.192.in-addr.arpa. 0   IN  PTR desk-vm-ubuntu-beta.

;; Query time: 14 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Oct 16 17:47:47 2011
;; MSG SIZE  rcvd: 77

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27462
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;192.168.1.1.           IN  A

;; ANSWER SECTION:
192.168.1.1.        0   IN  A   192.168.1.1

;; Query time: 11 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Oct 16 17:47:47 2011
;; MSG SIZE  rcvd: 45
strace 引导我到 arp,它阻塞了 5 秒,每个 facter 调用两次:
$ time arp -a
? (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0

real    0m5.127s
user    0m0.004s
sys     0m0.016s

我将 VM 从 NAT 网络更改为桥接,以便它现在在网络上有一个 IP,并且 arp 现在立即返回。 (我不是网络专家,所以我不知道为什么会这样,但这似乎是一个合理的尝试。)但是 facter 仍然总共需要大约 4-5 秒才能运行并且仍然报告“无法检索事实 fqdn”。 facter -d 显示多次出现“域的值仍然为零”,一直到最后。我在想有些事情还是不太对劲。

最佳答案

由于 puppet 使用 fqdn 事实来确定它作为哪个节点运行,如果无法确定它可能无法运行。鉴于您所描述的内容,最简单的调试方法是 facter fqdn 而不是您的 puppet 命令行。

如果“几秒”非常接近 5 秒,则很可能是因为列出了一个错误的 DNS 服务器,因此您的 DNS 配置已损坏。/etc/resolv.conf 中有什么?如果您使用 resolv.conf 中列出的第一个名称服务器运行 dig -x $HOSTIP $DNSSERVERIP 会发生什么?

如果您查看 facter/fqdn.rb,您可以看到 facter 正在尝试做什么来解析 fqdn。在我最方便的版本中,它使用 facter/hostname.rbfacter/domainname.rb ,它们调用来自 facter/util/resolution.rb 的代码。

究竟会发生什么取决于您拥有什么版本的因子、什么操作系统,以及您可能究竟安装了什么。调用 /bin/hostnameuname (等)并进行 DNS 查找都是很有可能的。你总是可以使用 strace -t facter fqdn 来查看什么花费了时间(寻找时间戳的差距)

从您描述的所有内容来看,问题确实是 puppet/facter 真的想要一个域名,而您没有域名,您只有一个裸主机名。

domain example.com 添加到/etc/resolv.conf 应该可以解决问题。运行 hostname foo.example.com 也应该可以解决问题(但需要重新应用)。永久解决方案取决于确切的操作系统设置。

关于ruby - puppet/因素 "Could not retrieve fact fqdn": How to fix or circumvent?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7780322/

10-14 17:50