使用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代码。有关详细信息,请参阅项目链接:

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java PUT请求提供415不支持的媒体类型   JavaMockito:如何在不模拟所有参数的情况下轻松地存根一个方法   java如何将NameValuePair传递给安卓中的另一个活动?   servalet java中的tomcat错误   java Android手机无法连接到eclipse   nullpointerexception在Java中如何将null转换为false?   Java中的http代理身份验证   java如何确保最新版本的JAR与JNLP应用程序一起使用?   简单Java代码上的性能大内存占用   列出AWS EC2实例上运行的服务上的对象时,java 403访问被拒绝   java创建一个类,当创建一个新实例时,它会被添加到一个hasmap中   LookupService中的java getLocation方法返回null   java获取要在ListView中显示的ArrayList字符串编号/位置