#puppet #fact #facter
Вопрос:
Я видел документацию, особенно Внешние Факты и Пользовательские Факты.
У меня есть следующее 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, чтобы не усложнять.
Я использую 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
Ответ №1:
Я так и не понял, почему puppet уточняет этот факт , но мне удалось обойти это, явно позвонив parsejson()
, вот так:
if parsejson($facts['yum_repos'])['redhat']...['enabled'] != "1" {
...
}
Комментарии:
1. Если вы создадите факт, который получает свое значение непосредственно из вывода системной команды, то как это не будет отображаться в виде строки?
2. @JohnBollinger Во всей документации puppet/facter, на которую ссылается выше, говорится, что если вы выводите json, yaml или некоторые другие структурированные форматы, то они автоматически анализируются facter в структурированные данные. За исключением старых версий puppet ( После версии 4.0 он включен по умолчанию.
3. Я понимаю. Ну, либо документы, в которых вы это видели, неясны в их области применения, либо вы упустили это из виду: это относится к внешним фактам , а не к пользовательским фактам, реализованным через API Ruby .