Python Saltstack:我如何管理git repo中的文件?

时间:2013-05-21 16:13:10

标签: python salt-stack

我的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配置?

3 个答案:

答案 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.lateststate.highstate之前运行结帐命令:

  1. 添加其他cmd.run
  2. 要求git.latest
  3. 中的州
  4. 要求git.latest州的file.managed
  5. 然后当您运行state.highstate时,它将运行您的git checkout命令,然后将您的仓库更新为最新版本,然后确保该文件看起来应该如此。

    它不太理想,因为它总是报告文件已经在你的文件管理状态中发生了变化(因为你每次都会检查它),但它会完成你想要做的事情。

    如果您不希望每隔时间查看,您可以制定一些命令来检查您的git repo是否有上游更改,并使用onlyif arg cmd.run仅在您实际要进行新更改时才运行git checkout。这会使您的state.highstate输出更清晰(因为它不会经常更改)但更复杂,这是不理想的。

    如果您想进一步澄清,请与我联系。