mirror of
https://github.com/jpetazzo/container.training.git
synced 2026-05-17 06:16:37 +00:00
It is now possible to set the user login (instead of having it hardcoded to "docker"). Also, various actions have been broken out in separate functions to facilitate future maintenance.
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
#!/usr/bin/env python
|
|
import os
|
|
import sys
|
|
import time
|
|
import yaml
|
|
|
|
#################################
|
|
|
|
config = yaml.load(open("/tmp/settings.yaml"))
|
|
CLUSTER_SIZE = config["clustersize"]
|
|
CLUSTER_PREFIX = config["clusterprefix"]
|
|
|
|
#################################
|
|
|
|
# This script will be run as ubuntu user, which has root privileges.
|
|
|
|
STEP = 0
|
|
|
|
def bold(msg):
|
|
return "{} {} {}".format("$(tput smso)", msg, "$(tput rmso)")
|
|
|
|
def system(cmd):
|
|
global STEP
|
|
with open("/tmp/pp.status", "a") as f:
|
|
t1 = time.time()
|
|
f.write(bold("--- RUNNING [step {}] ---> {}...".format(STEP, cmd)))
|
|
retcode = os.system(cmd)
|
|
t2 = time.time()
|
|
td = str(t2-t1)[:5]
|
|
f.write(bold("[{}] in {}s\n".format(retcode, td)))
|
|
STEP += 1
|
|
with open(os.environ["HOME"] + "/.bash_history", "a") as f:
|
|
f.write("{}\n".format(cmd))
|
|
if retcode != 0:
|
|
msg = "The following command failed with exit code {}:\n".format(retcode)
|
|
msg+= cmd
|
|
raise(Exception(msg))
|
|
|
|
# Get our public IP address
|
|
# ipv4_retrieval_endpoint = "http://169.254.169.254/latest/meta-data/public-ipv4"
|
|
ipv4_retrieval_endpoint = "http://myip.enix.org/REMOTE_ADDR"
|
|
system("curl --silent {} > /tmp/ipv4".format(ipv4_retrieval_endpoint))
|
|
ipv4 = open("/tmp/ipv4").read()
|
|
system("echo HOSTIP={} | sudo tee -a /etc/environment".format(ipv4))
|
|
|
|
### BEGIN CLUSTERING ###
|
|
|
|
addresses = list(l.strip() for l in sys.stdin)
|
|
|
|
assert ipv4 in addresses
|
|
|
|
def makenames(addrs):
|
|
return [ "%s%s"%(CLUSTER_PREFIX, i+1) for i in range(len(addrs)) ]
|
|
|
|
while addresses:
|
|
cluster = addresses[:CLUSTER_SIZE]
|
|
addresses = addresses[CLUSTER_SIZE:]
|
|
if ipv4 not in cluster:
|
|
continue
|
|
names = makenames(cluster)
|
|
for ipaddr, name in zip(cluster, names):
|
|
system("grep ^{} /etc/hosts || echo {} {} | sudo tee -a /etc/hosts"
|
|
.format(ipaddr, ipaddr, name))
|
|
print(cluster)
|
|
|
|
mynode = cluster.index(ipv4) + 1
|
|
system("echo {}{} | sudo tee /etc/hostname".format(CLUSTER_PREFIX, mynode))
|
|
system("sudo hostname {}{}".format(CLUSTER_PREFIX, mynode))
|
|
|
|
# Record the IPV4 and name of the first node
|
|
system("echo {} | sudo tee /etc/ipv4_of_first_node".format(cluster[0]))
|
|
system("echo {} | sudo tee /etc/name_of_first_node".format(names[0]))
|
|
|
|
# Create a convenience file to easily check if we're the first node
|
|
if ipv4 == cluster[0]:
|
|
system("sudo ln -sf /bin/true /usr/local/bin/i_am_first_node")
|
|
else:
|
|
system("sudo ln -sf /bin/false /usr/local/bin/i_am_first_node")
|