2016-06-21 3 views
1

API 서비스를위한 복잡한 상태를 만들었습니다. git checkouts, python venv, uwsgi, nginx 등이 포함되어 있습니다. 정상적으로 작동합니다.SaltStack : 컨텍스트에서 다른 상태를 어떻게 반복합니까?

이제 템플릿으로 바꾸고 minion 당 여러 번 실행할 것입니다. 변수가 기둥에서 제공되는 것과 같습니다.

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

여기서 apiserver_template가 apiserver.config 각 API 인스턴스에 대한 모든 구성 데이터를 구비하여, 그것에 공급 상황에서 작동 할 것이다. 나는 syntax가 잘못되었다는 것을 알고 있지만 잘하면 local variable을 제공하면서 ruby ​​partial을 실행하는 것과 같은 아이디어를 전달하고있다.

소금기가있는 곳에서 어떻게 제대로 이루어 집니까?

답변

2

Jinja Macro는 내게 들리는 소리입니다. https://docs.saltstack.com/en/2015.8/topics/development/conventions/formulas.html#jinja-macros

한마디로 당신이 같은 사건이 보일 수 있습니다에이 무슨 : 각 API 서버가 git_repo, python_venv_path 및 python_venv_requirements을 가진 기둥 apiservers이

{% 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 %} 

가정하면 현재 사용에 대한 자세한 정보를 찾을 수 있습니다 값은이 같은 매크로를 사용할 수 있습니다

당신이 원하는 경우
{% 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 ini : file.managed : - 출처 : salt : //files/api.ini - 템플릿 : jinja - 컨텍스트 : [sitename]]}/api - {{apisite [ 'sitename' 사이트 이름 : {{apisite [ 'sitename']}} apiport : {{apisite [ 'apiport']}} whis is very wugly imo – DeeY