问题描述
我正在创建一个虚拟机计划,将docker安装在4台主机上,在第一台主机上启用集群,然后将其他3台主机添加到该集群中。
我的问题是我不知道如何将Yaml的这一部分保存到变量中。
steps:
- command: docker swarm init
targets: $firstmanagementnode
我需要这样做,因为输出包含一个密钥,以允许其他主机稍后在计划中加入集群
下面的Puppet文档中有一个示例,但老实说,我可以做个例子
steps:
- name: hostnames
command: hostname -f
targets: $targets
- task: echo
parameters:
message: $hostnames.map |$hostname_result| { $hostname_result['stdout'] }.join(',')
我可以使用下面的yaml和任务解决我的问题:
YAML:
- name: initswarm
command: docker swarm init
targets: $firstmanagementnode
- name: managertoken
command: docker swarm join-token manager
targets: $firstmanagementnode
- name: managersjoin
task: docker_swarm::joinswarm
targets: $managernodes
parameters:
masternode: $managertoken.map |$token_result| { $token_result['stdout'] }.join(',')
description: configure additional manager nodes
任务:
#!/bin/bash
$(echo $PT_masternode | grep -o 'docker.*2377')
任务json:
{
"description": "joins a docker swarm","input_method": "both","parameters": {
"masternode": {
"description": "The first master node","type": "String"
}
}
}
解决方法
您是否尝试过伪造https://forge.puppet.com/puppetlabs/docker上的Docker模块。
您要执行的许多工作已经作为独立任务完成,您可能只需要将其包装到计划中即可。
在https://github.com/puppetlabs/puppetlabs-docker/tree/main/tasks处查看任务。.rb文件是代码,.json实际上是手册页,如果您将此模块拉入Bolt服务器,则可以运行bolt task show docker::swarm_join
以获得更多信息。
此处的任务将初始化swarm,还有另一个名为swarm_token的任务,该任务将返回您的令牌以在计划中使用并传递到swarm_join。
没有安装docker的任务,但是您在计划中要做的就是在计划开始时添加include docker
。