Как создать кукольные внешние структурированные факты из скрипта, такие как python или bash?

#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 .