4

我的 git 存储库中有一个配置文件 config.py。它具有特定于开发人员的配置设置。

我也有与 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 存储库的 salt 指令的样子:

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

这个错误是有道理的——我已经检查了存储库,进行了更改(通过我的托管文件),因此对特定于开发人员的配置文件的更改会导致问题。

如何强制 salt 按特定顺序执行任务?git checkout config.py(例如,在继续之前发出git pull?)

或者,是否有更好/不同的方式我应该在 salt 中管理这个 prod-vs-dev 配置?

4

3 回答 3

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
于 2013-05-21T21:40:34.367 回答
1

如果您只想在git.lateston之前运行 checkout 命令state.highstate

  1. 添加额外的cmd.run状态
  2. 要求您所在州的该git.latest
  3. 要求git.latest你所在州的file.managed状态

然后当你运行时state.highstate,它会运行你的git checkout命令,然后将你的 repo 更新为最新的,然后确保文件看起来像它应该的那样。

它并不理想,因为它总是报告文件在您的 file.managed 状态下发生了更改(因为您每次都会检查它),但它会完成您打算做的事情。

如果您不想每次都检查它,您可以制作一些命令来检查您的 git 存储库是否有上游更改,并使用onlyifargcmd.rungit checkout在您确实要拉新更改时运行。这将使您的state.highstate输出更清晰(因为它不会经常更改)但更复杂,这并不理想。

如果您想进一步澄清,请随时通知我。

于 2013-05-21T22:06:34.403 回答
0

这听起来更像是一个 git 问题,而不是一个 salt 问题。

考虑使用git stash(可能git stash --keep-index)。
(然后git stash pop

不过,我只会在那个配置文件上使用它,因为在多用户 repo 上绑定到上游的文件上执行此操作时,很容易遇到合并冲突。

于 2013-05-21T16:26:22.047 回答