问题:
在创建Docker Swarm集群的过程中,执行完docker swarm init 命令以后,集群就已经创建好了,可以通过 docker swarm join-token manager 命令和docker swarm join-token worker命令,分别显示管理节点和工作节点加入到集群的命令,其中有令牌的信息。
一般通过手工复制提示信息中的整个命令,也能顺利的将其余的管理节点和工作节点加入到 Swarm 集群中。但如果能够通过shell编程,截取命令输出信息中的固定长度的令牌信息,就可以实现Docker Swarm集群创建过程的自动化,截取令牌,非常有用。
解决:
1、将命令输出通过grep token过滤,得到一行字符串,其中包含令牌;
2、从字符串变量中截取第x到第y位置的字符串,这就是令牌字符串;
# 原始输出:
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-18foycvyym1btrks0xshjoh2a51kg1wkf90qlnd601op1owj9e-477vghk0
mw93l7nklgt9mehgv \
192.168.99.118:2377
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-18foycvyym1btrks0xshjoh2a51kg1wkf90qlnd601op1owj9e-blqzz5y4
8jbd61j0ywzbgvkp9 \
192.168.99.118:2377
# 使用grep token 过滤后的输出
$ docker swarm join-token manager|grep token
--token SWMTKN-1-18foycvyym1btrks0xshjoh2a51kg1wkf90qlnd601op1owj9e-477vghk0
mw93l7nklgt9mehgv \
$ docker swarm join-token worker|grep token
--token SWMTKN-1-18foycvyym1btrks0xshjoh2a51kg1wkf90qlnd601op1owj9e-blqzz5y4
8jbd61j0ywzbgvkp9 \
代码:
#切换到主控节点manager1上
eval $(docker-machine env manager1)
#显示管理节点加入集群的信息,截取其中的令牌作为变量
#T1是上面管理节点加入集群的整个字符串,
#包含前面4个无用的空格和--token及空格8个字符,一共12个字符,
#${T1:12:85},截取T1字符串,从第12个到85个,刚好是令牌。
T1=`docker swarm join-token manager|grep token`
TM=${T1:12:85}
Echo 管理节点令牌: $TM
#显示工作节点加入集群的信息,截取其中的令牌作为变量
#T2是工作节点的
T2=`docker swarm join-token worker|grep token`
TW=${T2:12:85}
Echo 工作节点令牌: $TW
#TM字符串变量是管理节点加入的令牌
#TW字符串变量是工作节点加入的令牌
#便于后面编程使用
命令:
eval $(docker-machine env manager1)
T1=`docker swarm join-token manager|grep token`
TM=${T1:12:85}
Echo 管理节点令牌: $TM
T2=`docker swarm join-token worker|grep token`
TW=${T2:12:85}
Echo 工作节点令牌: $TW
截图:
后记:
#1、既然已经得到 T1=`docker swarm join-token manager|grep token`这个变量,是否可以直接利用T1这个变量到 集群的创建命令中?有待验证。
#T1 的值是“ --token SWMTKN-1-18foycvyym1btrks0xshjoh2a51kg1wkf90qlnd601op1owj9e-477vghk0mw93l7nklgt9mehgv \”
# 2、字符串截取操作的例子
$var1=cowabunga
$echo ${var:0:3}
cow
$echo ${var1:3:7}
abunga