2016-06-21 8 views
1

Я создал сложное состояние для службы API, он включает в себя git checkouts, python venv, uwsgi, nginx и т. Д. И т. Д. Он отлично работает.SaltStack: как я могу повторить другие состояния с контекстом?

Теперь я хотел бы превратить его в шаблон и выполнить его несколько раз на миньон, с переменными, поставляемыми из столба - например, что-то типа.

{% for apiserver in pillar.apiservers %} 
     include apiserver_template.sls, locals: apiserver.config 
    {% endfor %} 

, где apiserver_template будет работать с контекстом, подаваемого на него, при apiserver.config, имеющие все конфигурационные данные для каждого экземпляра API. Я знаю, что синтаксис неверен, но, надеюсь, я общаюсь с идеей - в идеале, что-то вроде выполнения частичных рубинов с поставкой локальных переменных.

Как это делается правильно в соленой?

ответ

2

Звучит так же, как Jinja Macro - это то, что вы хотите использовать для этого. Вы можете найти более подробную информацию об использовании здесь: https://docs.saltstack.com/en/2015.8/topics/development/conventions/formulas.html#jinja-macros

Короче, что вы будете иметь в вашем случае может выглядеть следующим образом:

{% macro api_server(git_repo, python_venv_path, python_venv_requirements) %} 
{{python_venv_path}}: 
    virtualenv.managed: 
    - system_site_packages: False 
    - requirements: salt://{{python_venv_requirements}} 

{{git_repo}}: 
    git.latest: 
    - name: {{git_repo}} 
{% endmacro %} 

Предполагая, что у вас есть столп apiservers, где каждый сервер УПУ git_repo, python_venv_path и python_venv_requirements значения, вы можете использовать макрос так:

{% for server in salt.pillar.get('apiservers', []) %} 
{{ api_server(server['git_repo'], server['python_venv_path'], server['python_venv_requirements']) }} 
{% endfor %} 

Если вы хотите - вы также можете поместить макрос в отдельном файле состояния, а затем импортировать как Марко регулярной соли ресурса.

Пожалуйста, также не то, что вместо pillar.apiservers я использовал salt.pillar.get ('apiservers', []). Это более безопасный способ получить данные из столбца. Если по какой-то причине столп недоступен - более поздний код приведет к пустой dict вместо отказа в первом случае.

+0

Спасибо, я сделал что-то очень похожее самостоятельно, единственное, что некоторое время заставляло меня озадачиваться в том, что внутри состояния шаблона я отобразил некоторые файлы шаблонов, и для них передаются переменные /opt/{{apisite ['sitename']}}/api - {{apisite ['sitename']}}. ini: file.managed: - источник: соль: //files/api.ini - шаблон: jinja - контекст: sitename: {{apisite ['sitename']}} apiport: {{apisite ['apiport'}}} Это довольно уродливое imo – DeeY