使用python封装的terraform在数字海洋上创建集群
swarm-tf的Python项目详细描述
使用python的swarm terraform
这是一个python包,它封装了在数字海洋创建集群所必需的terraform。 您不需要知道terraform配置语言(即hcl),只需要知道python。
但是,您将依赖于创建terraform的资源。两个世界中最好的:)
这个脚本创建了什么?
- 全docker swarm集群
- 具有自动连接的管理器节点
- 具有自动联接的工作节点
- 创建或使用现有卷并自动将其附加到节点
- 自定义数字海洋标签
- 为群集创建防火墙
- 在数字海洋中使用现有DNS,并为每个节点添加地址记录。
- (@todo soon)创建可在Docker Swarm集群内使用的nfs服务器
开始
1-将swarm tf添加到您的项目中:
pip install swarm_tf=0.2.4
2-创建群集:
importsysfromterraobjectimportTerraobjectfromswarm_tf.workersimportWorkerVariablesfromswarm_tf.workersimportWorkerfromswarm_tf.managersimportManagerVariablesfromterrascriptimportprovider,function,outputfromterrascript.digitalocean.dimportdigitalocean_ssh_keyasdata_digitalocean_ssh_keyfromswarm_tf.managersimportManagerfromswarm_tf.commonimportVolumeClaim,get_user_data_script,create_firewallfromterrascript.digitalocean.rimport*# Setupdo_token="DIGITAL OCEAN TOKEN"# Commondomain="swarm.example.com"region="nyc3"ssh_key_file="~/.ssh/id_rsa"# Need to be full pathuser_data=get_user_data_script()o=Terraobject()o.terrascript.add(provider("digitalocean",token=do_token))# ---------------------------------------------# Get Existing Object at Digital Ocean# ---------------------------------------------do_sshkey=data_digitalocean_ssh_key("mysshkey",name="id_rsa")o.terrascript.add(do_sshkey)o.shared['sshkey']=do_sshkey# ---------------------------------------------# Creating Swarm Manager# ---------------------------------------------managerVar=ManagerVariables()managerVar.image="ubuntu-18-04-x64"managerVar.size="s-1vcpu-1gb"managerVar.name="manager"managerVar.region=regionmanagerVar.domain=domainmanagerVar.total_instances=1managerVar.user_data=user_datamanagerVar.tags=["cluster","manager"]managerVar.remote_api_ca=NonemanagerVar.remote_api_key=NonemanagerVar.remote_api_certificate=NonemanagerVar.ssh_keys=[do_sshkey.id]managerVar.provision_ssh_key=ssh_key_filemanagerVar.provision_user="root"managerVar.connection_timeout="2m"managerVar.create_dns=Truemanager=Manager(o,managerVar)manager.create_managers()# ---------------------------------------------# Creating Worker Nodes# ---------------------------------------------workerVar=WorkerVariables()workerVar.image="ubuntu-18-04-x64"workerVar.size="s-1vcpu-1gb"workerVar.name="worker"workerVar.region=regionworkerVar.domain=domainworkerVar.total_instances=2workerVar.user_data=user_dataworkerVar.tags=["cluster","worker"]workerVar.manager_private_ip=o.shared["manager_nodes"][0].ipv4_address_privateworkerVar.join_token=function.lookup(o.shared["swarm_tokens"].result,"worker","")workerVar.ssh_keys=[do_sshkey.id]workerVar.provision_ssh_key=ssh_key_fileworkerVar.provision_user="root"workerVar.persistent_volumes=NoneworkerVar.connection_timeout="2m"workerVar.create_dns=Trueworker=Worker(o,workerVar)worker.create_workers()# ---------------------------------------------# Creating Persistent Nodes# ---------------------------------------------workerVar.name="persistent"workerVar.persistent_volumes=[VolumeClaim(o,region,"volume-nyc3-01")]workerVar.total_instances=1persistent_worker=Worker(o,workerVar)persistent_worker.create_workers()# ---------------------------------------------# Creating Firewall# ---------------------------------------------create_firewall(o,domain=domain,inbound_ports=[22,80,443,9000],tag="cluster")# ---------------------------------------------# Outputs# ---------------------------------------------o.terrascript.add(output("manager_ips",value=[value.ipv4_addressforvalueino.shared["manager_nodes"]],description="The manager nodes public ipv4 addresses"))o.terrascript.add(output("manager_ips_private",value=[value.ipv4_address_privateforvalueino.shared["manager_nodes"]],description="The manager nodes private ipv4 addresses"))o.terrascript.add(output("worker_ips",value=[value.ipv4_addressforvalueino.shared["worker_nodes"]],description="The worker nodes public ipv4 addresses"))o.terrascript.add(output("worker_ips_private",value=[value.ipv4_address_privateforvalueino.shared["worker_nodes"]],description="The worker nodes private ipv4 addresses"))o.terrascript.add(output("manager_token",value=function.lookup(o.shared["swarm_tokens"].result,"manager",""),description="The Docker Swarm manager join token",sensitive=True))o.terrascript.add(output("worker_token",value=function.lookup(o.shared["swarm_tokens"].result,"worker",""),description="The Docker Swarm worker join token",sensitive=True))o.terrascript.add(output("worker_ids",value=[value.idforvalueino.shared["worker_nodes"]]))o.terrascript.add(output("manager_ids",value=[value.idforvalueino.shared["manager_nodes"]]))o.terrascript.add(output("private_key_path",value=ssh_key_file))iflen(sys.argv)==2andsys.argv[1]=="label":forobjino.shared["__variables"]:foriinrange(1,obj["instances"]+1):print("docker node update --label-add type={0}{0}-{1:02d}".format(obj["type"],i))else:print(o.terrascript.dump())
卷
可以使用^ {CD1>}类来附加一个存在或创建一个新的卷到一个液滴。本卷
将装入主机文件夹/data
。因此您可以将堆栈或服务映射部署到此卷。
地形平面图和应用
相反,要直接运行terraform,可以使用运行python的terrascript
包装器,保存terraform json,然后
执行你想要的地形动作。
例如,要运行terraform计划,可以使用以下命令:
terrascript plan -out my.tfplan
申请时,您可以使用:
terrascript apply "my.tfplan"
注意:您的主脚本需要命名为main.py
,并且需要在运行terrascript
的文件夹中
部署服务和堆栈
只能在计算机上执行部署。我们提供了一个连接到管理器的脚本,这样您就可以 从本地计算机部署堆栈和服务。执行以下命令:
connect_to_manager -c exportDOCKER_HOST=tcp://localhost:2377
要断开连接,请执行:
connect_to_manager -d
unset DOCKER_HOST
参考文献:
swarm tf使用python_terrascript
代码。有关详细信息,请参阅项目链接: