我的git存储库中有一个配置文件config.py。它具有特定于dev的配置设置。
我在salt中也有与托管文件相同的文件,它具有特定于生产的配置。
该文件的配置指令如下所示:
python_config:
file.managed:
- name: /opt/github/python_config/config.py
- source: salt://configs/config.py
- makedirs: True
因为/opt/github
是一个git存储库,每当我尝试更新该目录时,都会收到一条错误:“你对python_config / config.py的本地更改将被合并覆盖。”
这是我的github repo的盐指令:
code:
git.latest:
- name: {{ pillar['git_repo'] }}
- rev: {{ pillar['git_rev'] }}
- target: {{ pillar['source_path'] }}
- force: True
- require:
- pkg: app-pkgs
- file: deploykey
- file: publickey
- file: ssh_config
此错误有意义 - 我已检出存储库,进行了更改(通过我的托管文件),因此 new 更改了特定于dev的配置文件会导致问题。
如何强制盐按特定顺序执行任务? (例如,在继续git checkout config.py
之前发出git pull
?)
或者,是否有更好/不同的方式我应该在盐中管理这个prod-vs-dev配置?
答案 0 :(得分:4)
这里最好的选择可能是使用gitfs后端。
可以在此处找到文档:http://docs.saltstack.com/topics/tutorials/gitfs.html
这允许您使用git作为file_roots的后端。
每个git分支和标记都成为Salt环境,它将很好地映射到您的生产和开发配置。
这将消除您对git.latest状态声明的需求。
python_config:
file.managed:
- name: /opt/github/python_config/config.py
- source: salt://configs/config.py
- makedirs: True
答案 1 :(得分:0)
这听起来更像是一个git问题,而不是盐问题。
使用git stash
(可能是git stash --keep-index
)
(然后git stash pop
)
我只会在那个配置文件中使用它,因为在多用户存储库上绑定到上游的文件上执行此操作时,您很容易遇到合并冲突。
答案 2 :(得分:0)
如果您想在git.latest
上state.highstate
之前运行结帐命令:
cmd.run
州git.latest
州git.latest
州的file.managed
州然后当您运行state.highstate
时,它将运行您的git checkout
命令,然后将您的仓库更新为最新版本,然后确保该文件看起来应该如此。
它不太理想,因为它总是报告文件已经在你的文件管理状态中发生了变化(因为你每次都会检查它),但它会完成你想要做的事情。
如果您不希望每隔时间查看,您可以制定一些命令来检查您的git repo是否有上游更改,并使用onlyif
arg cmd.run
仅在您实际要进行新更改时才运行git checkout
。这会使您的state.highstate
输出更清晰(因为它不会经常更改)但更复杂,这是不理想的。
如果您想进一步澄清,请与我联系。