我目前正在构建依赖Salt和Docker的部署系统。为简单起见,假设我想在同一台服务器上为2个客户端部署gitlab。
我的应用程序的所有参数都存储在Pillar中。
cat /srv/pillar/top.sls
<nav>
<div class="center">
<h1 id="center-title"> Blocs </h1>
</div>
<div id="dropdown">
<img id="cog" src="/static/images/cog2.png" alt="" />
<div id="dropdown-content">
<a href="profile.html"> Profile </a>
<a href="settings.html"> Settings </a>
<a href="logs.html"> Logs </a>
<a href="emails.html"> Email list </a>
</div>
</div>
</nav>
</div>
cat /srv/pillar/client1/git.sls
'myminion':
- client1.git
- client2.git
cat /srv/pillar/client2/git.sls
gitlab:
client1:
domains:
- git.client1.net
container_no : 1
到目前为止,我的Salt状态包含部署不同应用程序配置文件的特定指令(Django,NodeJS,Gitlab ...)。对于Gitlab来说,它将是:
$ cat /srv/salt/profile/gitlab/init.sls
gitlab:
client2:
domains:
- git.client2.com
container_no : 2
一切正常。但有了这个,我无法一次部署一个应用程序。我必须这样做:
salt myminion state.apply profile.gitlab
这将在服务器上部署所有gitlab应用程序。但我希望能够只触发一个应用程序。
我很长时间没有玩Salt,但我觉得所有应用程序上的循环并不是一种优雅的方式来完成这项工作。什么是咸方式呢?
答案 0 :(得分:1)
我想在评论中说明并不强制您为每个应用程序创建状态文件。想想这样的事情:
{% for app_name,config in pillar.get('gitlab', {}).items() %}
fetch_{{app_name}}:
git.latest:
- name: https://mydomain.tld/apps/foo.git
- target: /var/www/foo
haproxy_{{app_name}}:
module.run:
- name: haproxyctl.add
- app_name: {{app_name}}
- domains: {{ config['domains'] }}
- onchanges:
- git: fetch_{{app_name}}
# all following states should "listen to" the git.latest state
[...]
{% endfor %}
通过这种方式,您仍然可以不直接触发一个应用程序在您的minion上进行升级,但事实上,如果存储库中有更改,salt将只执行您的某个应用程序的所有状态。
这并不是你要求的 - 但它可能是一种可能的解决方案。