是否可以并行运行sls文件?

问题描述

我正在运行一个sls文件,该文件启动一个Docker容器,该容器应在后台保持活动状态。它确实可以工作,容器已启动并正在运行。但是,直到我杀死小兵上的容器之前,我无法运行任何其他state.apply命令,因为我得到了:

 The function "state.apply" is running as PID 44455 and was started at 2020,Aug 19 18:49:13.242099 with jid 20200819184913242099

现在,我发现了以下文档:https://docs.saltstack.com/en/latest/ref/states/parallel.html暗示实际上是可能的。但是,当我将其添加到我的SLS文件时,它不起作用。在杀死容器之前,我仍然无法调用新的state.apply。 这是我的文件的样子:

docker.io:
pkg.installed: []
require:
- pkgrepo: docker_prerequisites
- pkg: docker_prerequisites
service.running:
- parallel: True
- name: docker
- enable: True
- restart: True
- image: ubuntu
- port_bindings: 800:80

docker:
cmd.run:
- name: docker run -t  ubuntu

我使用的命令是否错误?这就是我根据文档确定的方式。还是有其他方法可以从SLS文件启动保持活动状态的Docker容器?

解决方法

如果您查看盐记录或流程经理,您将非常有可能找出此处发生的情况。只要命令运行,状态就一直在运行。 问题出在您的cmd.run中。只要执行其中的命令,Salt就会执行cmd.run。如果当前没有其他cmd.run正在运行,则Salt仅会执行下一个cmd.run。否则,您将得到所提到的错误。

- name: docker run -t  ubuntu

您使用的命令将附加容器外壳。 (-t)因此,盐正在等待命令结束。在这种情况下,直到关闭容器外壳,该命令才会结束。 解决方案是,拆下容器外壳,使其作为后台进程存在,然后再附加。

docker:
cmd.run:
- name: docker run -t -d ubuntu

只需添加-d参数,即可分离容器外壳,并且容器在后台运行。通过添加此参数,您的saltstate应该会结束。

现在,由于容器在后台运行,您可以使用以下命令将自己附加到容器外壳:

docker exec -it <container_id> /bin/bash

但是,这是如何并行运行saltstate:

将盐状态应用于目标小仆时,请尝试在结尾的盐或盐调用命令中添加以下参数:concurrent=true

请参阅此文档并搜索并发:https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.state.html

本文介绍了该问题。但是,您应该注意这一点,因为同时运行同一盐模块两次可能很危险。因此,请避免这种情况。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...