2014-12-09 3 views
3

Я стараюсь писать пользовательские зерна. я ставлю этот код в /etc/salt/grainsСоль нестандартных зерен

#!/usr/bin/env python 
def function(): 
    grains = {} 
    grains['test'] = "test" 
    return grains 

и проверить его я создал этот скрипт:

import salt.config 
import salt.loader 
__opts__ = salt.config.minion_config('/etc/salt/minion') 
__grains__ = salt.loader.grains(__opts__) 
test = __grains__['test'] 
print test 

Я получил эту ошибку:

dirs = __grains__['test'] 
KeyError: 'test' 

Что случилось с этим?

+0

Где 'dirs' быть назначен' __grains __ [ 'тест'] '. Я не вижу переменную 'dirs' в любом месте вашего предоставленного кода. Может, что-то сбивает тебя с толку в другом месте? –

ответ

8

/etc/salt/grains где соль хранит зерна, установленные salt targetid grains.setval и друзьями. Это плоский статический файл yaml.

Пользовательские зерна через python входят в/srv/salt/_grains, а затем синхронизируются с миньонами с salt \* saltutil.sync_grains. Здесь вы должны поместить свой скрипт python.

Вот пример, похожий на ваш код с вырубкой и проверки:

$ cat /srv/salt/_grains/spam.py 
#!/usr/bin/env python 
import logging 
log = logging.getLogger(__name__) 

def function(): 
    log.trace('Setting grains["spam"] to "eggs"') 
    grains = {} 
    grains['spam'] = "eggs" 
    return grains 

$ sudo salt lead saltutil.sync_grains 
lead: 
    - grains.spam 

$ sudo salt-call grains.item spam -l trace 2>&1 \ 
    | egrep '^local|spam' 
[TRACE ] Added spam.function to grain 
[TRACE ] Setting grains["spam"] to "eggs" 
local: 
    spam: eggs 

$ cat /tmp/spam_taster.py 
#!/usr/bin/env python 
import salt.config 
import salt.loader 
__opts__ = salt.config.minion_config('/etc/salt/minion') 
__grains__ = salt.loader.grains(__opts__) 
spam = __grains__['spam'] 
print spam 

$ python /tmp/spam_taster.py 
eggs 
+0

Спасибо, я сделал это так, у меня все еще такая же ошибка. Я думаю, что синхронизация не работает. – 4m1nh4j1

+0

Я подозреваю, что у вас есть другой код, который здесь не указан. 'dirs' нет в ваших примерах. Вы можете использовать регистратор для отслеживания кода: 'import logging; log = logging.getLogger (__ name __) ', а затем посыпать' log.trace («Теперь в этой части кода») 'вокруг вашего кода. –

+0

@ 4m1nh4j1 Мне было интересно, считаете ли вы, что это ответили? –