bash脚本卡在for循环的末尾

时间:2018-10-23 11:33:04

标签: bash docker-machine

我正在尝试通过脚本部署$ DM_COUNT个docker-machine,并将新的网络配置写入节点。该脚本可以正常工作,直到循环结束,然后陷入困境

该脚本从以下脚本中调用:

#!/bin/bash
set -x
PS4='$LINENO: '

net="10.17.65."

循环正常开始

for i in $(seq 1 $DM_COUNT); do
(
name="$PREFIX$DEPLOYMENTNAME$i"
echo "$name"

if [ -z "$DM_NAMES" ]
then
    export DM_NAMES=$name
else
    export DM_NAMES=$DM_NAMES:$name
fi

ip="$net$((4 + i))"
mkdir -p ~/.ssh && touch $_/config &&
tee -a $_ << EOF
Host $name
  Hostname $ip
  User docker
  IdentityFile ~/.docker/machine/machines/$name/id_rsa
EOF

 docker-machine create $name\
                  --driver vmwarevsphere \
                  --vmwarevsphere-cpu-count 4 \
                  --vmwarevsphere-datastore datastore1 \
                  --vmwarevsphere-disk-size 60000 \
                  --vmwarevsphere-memory-size 2048 \
                  --vmwarevsphere-network 'VM\ Network' \
                  --vmwarevsphere-vcenter 10.17.6.218 \
                  --vmwarevsphere-password a \
                  --vmwarevsphere-username root

docker-machine restart "$name"
docker-machine regenerate-certs -f "$name"
echo 'Done provisioning ' "$name"

docker-machine scp -r /certs/ "$name":/root/certs/
docker-machine ssh "$name" sudo mkdir /var/lib/boot2docker/certs

docker-machine ssh "$name" sudo cp /root/certs/*.crt /var/lib/boot2docker/certs/

echo 'Done copying self-signed certificates'

echo "
    # configure eht1 (czlocal1)
    sudo ip addr flush dev eth1
    sudo ip route del default
    sudo ip route add default via 192.168.1.254

    # configure eth2 (czlocal2)
    sudo ip addr flush dev eth0
    sudo ip route add default via 192.168.2.254

    # configure eth3 (czlocaldhcp)
    sudo ip addr flush dev eth0

    # configure eth0 (mgmt)
    sudo ip addr flush dev eth0
    ip addr add 10.17.65.10$i/24 dev eth0
    ip route add 10.17.36.0/24 via 10.17.65.1 dev eth0
    ip route add 10.17.33.0/24 via 10.17.65.1 dev eth0

    # configure eth2 (czlocal2)
    sudo ip addr flush dev eth2
    ip addr add 192.168.2.$i/24

    # configure eth3 (czlocaldhcp)
    sudo ip addr flush dev eth3
" | docker-machine ssh "$name" "sudo tee /var/lib/boot2docker/bootsync.sh"

echo "
    sudo ip route del default
    sudo ip route add default via 192.168.$1.254
" | docker-machine ssh "$name" "sudo tee ~/switch_default_gateway.sh"

echo "
    alias local1='ip route del default && ip route add default via 192.168.1.254'
    alias local2='ip route del default && ip route add default via 192.168.2.254'
    alias dhcp='ip route del default && ip route add default via 172.0.0.254'
" | docker-machine ssh "$name" "sudo tee -a ~/.bashrc > /dev/null"

echo 'Done writing scripts'

docker-machine ssh "$name" "sudo chmod +x /var/lib/boot2docker/bootsync.sh"
docker-machine ssh "$name" "sudo chmod +x ~/switch_default_gateway.sh"
docker-machine ssh "$name" "source ~/.bashrc"

jq '.Driver.IPAddress = $newVal' --arg newVal '10.17.65.10'$i ~/.docker/machine/machines/"$name"/config.json > tmp.$$.json && mv tmp.$$.json ~/.docker/machine/machines/"$name"/config.json

echo 'Done deploying docker machines'

) &
done

一切正常,直到此刻执行正常,然后脚本被卡住。如果我在外壳上提供任何输入,它将退出。

tee -a ~/.ssh/config << EOF
Host *
  StrictHostKeyChecking no
EOF

最后一部分永远不会执行

1 个答案:

答案 0 :(得分:1)

您确定在 <<< / strong>和 EOF 之间没有“不可破坏的空间”(https://en.wikipedia.org/wiki/Non-breaking_space)吗?

无论如何,您的初始脚本和问题末尾的指示行是不相同的(涉及到 tee 命令的行),您是否可以更新问题以适合最终版本脚本?