我看过文档,特别是External Facts和Custom Facts。
我有以下yum_repos.rb
:
require 'facter'
Facter.add('yum_repos') do
setcode '/usr/bin/python3 /opt/puppetlabs/puppet/cache/lib/facter/yum_repos.py'
end
我有以下yum_repos.py
:
#!/usr/bin/python3
import configparser
import os
import json
result_dict={}
yum_repos_dir = '/etc/yum.repos.d'
for yum_repo_file in os.listdir(yum_repos_dir):
if not yum_repo_file.endswith(".repo"):
continue
yum_repo_name=yum_repo_file.replace(".repo","")
config = configparser.ConfigParser()
config.read(os.path.join(yum_repos_dir, yum_repo_file))
result_dict[yum_repo_name] = {}
for section in config.sections():
result_dict[yum_repo_name][section] = dict(config[section])
print(json.dumps(result_dict))
当我检查因子时,它全部运行,但yum_repos
事实是一个字符串。为什么它不是结构化的?我在网上找到一个地方,说(对于旧版本的puppet)stringify_facts
必须设置为false,所以我试了一下,但是行为没有改变。我相信默认值在4.0中被更改为不stringify。
我使用的是puppet 6.24.0
我试着像这样在木偶课上获取事实:
if $facts['yum_repos']['redhat']...['enabled'] != 1 {
...
}
当我运行puppet agent时,我得到错误消息:
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: A substring operation does not accept a String as a character index. Expected an Integer
我从来没有弄清楚为什么puppet是字符串化的事实,但我能够通过显式调用parsejson()
来解决问题,像这样:
if parsejson($facts['yum_repos'])['redhat']...['enabled'] != "1" {
...
}