{ "info": { "author": "Joao Gilberto Magalhaes", "author_email": "joao@byjg.com.br", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# Swarm Terraform using Python\n\nThis is a python package that wraps the terraform necessary to create a Swarm Cluster at Digital Ocean.\nYou do not need to know the terraform configuration language (a.k.a HCL), just Python.\n\nHowever, you'll rely the creation of the resources to Terraform. The best of the two worlds :)\n\n# What this script create?\n\n- Full Docker Swarm cluster\n- Manager Node with auto-join\n- Worker Node with auto-join\n- Create or use an existing volume and attach it automatically to the node\n- Custom Digital Ocean tags\n- Create a Firewall for the Cluster\n- Use existing DNS at Digital Ocean and add address record for each node.\n- (@todo soon) Create NFS Server that can be used inside the docker swarm cluster\n\n# Get Started\n\n1 - Add to your project the Swarm_TF:\n\n```bash\npip install swarm_tf=0.2.4\n```\n\n2 - Create your Cluster:\n\n```python\nimport sys\nfrom terraobject import Terraobject\nfrom swarm_tf.workers import WorkerVariables\nfrom swarm_tf.workers import Worker\nfrom swarm_tf.managers import ManagerVariables\nfrom terrascript import provider, function, output\nfrom terrascript.digitalocean.d import digitalocean_ssh_key as data_digitalocean_ssh_key\nfrom swarm_tf.managers import Manager\nfrom swarm_tf.common import VolumeClaim, get_user_data_script, create_firewall\nfrom terrascript.digitalocean.r import *\n\n# Setup\ndo_token = \"DIGITAL OCEAN TOKEN\"\n\n# Common\ndomain = \"swarm.example.com\"\nregion = \"nyc3\"\nssh_key_file = \"~/.ssh/id_rsa\" # Need to be full path\nuser_data = get_user_data_script()\n\no = Terraobject()\n\no.terrascript.add(provider(\"digitalocean\", token=do_token))\n\n# ---------------------------------------------\n# Get Existing Object at Digital Ocean\n# ---------------------------------------------\ndo_sshkey = data_digitalocean_ssh_key(\"mysshkey\", name=\"id_rsa\")\no.terrascript.add(do_sshkey)\no.shared['sshkey'] = do_sshkey\n\n\n# ---------------------------------------------\n# Creating Swarm Manager\n# ---------------------------------------------\nmanagerVar = ManagerVariables()\nmanagerVar.image = \"ubuntu-18-04-x64\"\nmanagerVar.size = \"s-1vcpu-1gb\"\nmanagerVar.name = \"manager\"\nmanagerVar.region = region\nmanagerVar.domain = domain\nmanagerVar.total_instances = 1\nmanagerVar.user_data = user_data\nmanagerVar.tags = [\"cluster\", \"manager\"]\nmanagerVar.remote_api_ca = None\nmanagerVar.remote_api_key = None\nmanagerVar.remote_api_certificate = None\nmanagerVar.ssh_keys = [do_sshkey.id]\nmanagerVar.provision_ssh_key = ssh_key_file\nmanagerVar.provision_user = \"root\"\nmanagerVar.connection_timeout = \"2m\"\nmanagerVar.create_dns = True\n\nmanager = Manager(o, managerVar)\nmanager.create_managers()\n\n# ---------------------------------------------\n# Creating Worker Nodes\n# ---------------------------------------------\nworkerVar = WorkerVariables()\nworkerVar.image = \"ubuntu-18-04-x64\"\nworkerVar.size = \"s-1vcpu-1gb\"\nworkerVar.name = \"worker\"\nworkerVar.region = region\nworkerVar.domain = domain\nworkerVar.total_instances = 2\nworkerVar.user_data = user_data\nworkerVar.tags = [\"cluster\", \"worker\"]\nworkerVar.manager_private_ip = o.shared[\"manager_nodes\"][0].ipv4_address_private\nworkerVar.join_token = function.lookup(o.shared[\"swarm_tokens\"].result, \"worker\", \"\")\nworkerVar.ssh_keys = [do_sshkey.id]\nworkerVar.provision_ssh_key = ssh_key_file\nworkerVar.provision_user = \"root\"\nworkerVar.persistent_volumes = None\nworkerVar.connection_timeout = \"2m\"\nworkerVar.create_dns = True\n\nworker = Worker(o, workerVar)\nworker.create_workers()\n\n# ---------------------------------------------\n# Creating Persistent Nodes\n# ---------------------------------------------\nworkerVar.name = \"persistent\"\nworkerVar.persistent_volumes = [VolumeClaim(o, region, \"volume-nyc3-01\")]\nworkerVar.total_instances = 1\npersistent_worker = Worker(o, workerVar)\npersistent_worker.create_workers()\n\n# ---------------------------------------------\n# Creating Firewall\n# ---------------------------------------------\ncreate_firewall(o, domain=domain, inbound_ports=[22, 80, 443, 9000], tag=\"cluster\")\n\n\n# ---------------------------------------------\n# Outputs\n# ---------------------------------------------\no.terrascript.add(output(\"manager_ips\",\n value=[value.ipv4_address for value in o.shared[\"manager_nodes\"]],\n description=\"The manager nodes public ipv4 addresses\"))\n\no.terrascript.add(output(\"manager_ips_private\",\n value=[value.ipv4_address_private for value in o.shared[\"manager_nodes\"]],\n description=\"The manager nodes private ipv4 addresses\"))\n\no.terrascript.add(output(\"worker_ips\",\n value=[value.ipv4_address for value in o.shared[\"worker_nodes\"]],\n description=\"The worker nodes public ipv4 addresses\"))\n\no.terrascript.add(output(\"worker_ips_private\",\n value=[value.ipv4_address_private for value in o.shared[\"worker_nodes\"]],\n description=\"The worker nodes private ipv4 addresses\"))\n\no.terrascript.add(output(\"manager_token\",\n value=function.lookup(o.shared[\"swarm_tokens\"].result, \"manager\", \"\"),\n description=\"The Docker Swarm manager join token\",\n sensitive=True))\n\no.terrascript.add(output(\"worker_token\",\n value=function.lookup(o.shared[\"swarm_tokens\"].result, \"worker\", \"\"),\n description=\"The Docker Swarm worker join token\",\n sensitive=True))\n\no.terrascript.add(output(\"worker_ids\",\n value=[value.id for value in o.shared[\"worker_nodes\"]]))\n\no.terrascript.add(output(\"manager_ids\",\n value=[value.id for value in o.shared[\"manager_nodes\"]]))\n\no.terrascript.add(output(\"private_key_path\", value=ssh_key_file))\n\n\nif len(sys.argv) == 2 and sys.argv[1] == \"label\":\n for obj in o.shared[\"__variables\"]:\n for i in range(1, obj[\"instances\"]+1):\n print(\"docker node update --label-add type={0} {0}-{1:02d}\".format(obj[\"type\"], i))\nelse:\n print(o.terrascript.dump())\n```\n\n# Volumes\n\nIt is possible to use the `VolumeClaim` class to attach an existent or create a new volume to a droplet. This volume\nwill be mounted in the host folder `/data`. So you can deploy your stack or service an map to this volume. \n\n# Terraform Plan & Apply\n\nInstead to run terraform directly you can use the `terrascript` wrapper that will run the python, save the terraform json and then \nexecute the terraform action you want. \n\nFor example, to run the terraform plan you can use this: \n\n```bash\nterrascript plan -out my.tfplan\n```\n\nand for apply you can use:\n\n```bash\nterrascript apply \"my.tfplan\"\n```\n\nNote: Your main script need to named as `main.py` and need to be in the folder your running the `terrascript`\n\n# Deploying Services and Stacks\n\nYou can only execute the Deploy on the machine. We provided a script to connect to the Manager, so this way you can\ndeploy your stacks and services from you local machine. Execute these commands:\n\n```bash\nconnect_to_manager -c\nexport DOCKER_HOST=tcp://localhost:2377\n```\n\nTo disconnect just execute:\n\n```bash\nconnect_to_manager -d\nunset DOCKER_HOST\n```\n\n\n# References:\n\n**swarm_tf** uses the `python_terrascript` code. Refer to the project link to get more information about it:\n- https://github.com/mjuenema/python-terrascript/\n\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/byjg/swarm_tf", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "swarm-tf", "package_url": "https://pypi.org/project/swarm-tf/", "platform": "", "project_url": "https://pypi.org/project/swarm-tf/", "project_urls": { "Homepage": "https://github.com/byjg/swarm_tf" }, "release_url": "https://pypi.org/project/swarm-tf/0.2.4/", "requires_dist": [ "terraobject (==0.0.1)", "terrascript (==0.6.0)" ], "requires_python": "", "summary": "Create a Swarm Cluster on Digital Ocean using Terraform Wrapped by Python", "version": "0.2.4" }, "last_serial": 5696257, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "cd8f725a0229b3a94b4d6faf6919823d", "sha256": "d710a023697cfde53f3f9a7834db6619c498de6da345005dc315a9388da45748" }, "downloads": -1, "filename": "swarm_tf-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cd8f725a0229b3a94b4d6faf6919823d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12968, "upload_time": "2019-07-29T04:51:20", "url": "https://files.pythonhosted.org/packages/ce/6e/abf38a0656a334816f01fb22087d98c0408d6bd6c89db18c4abec8543bdd/swarm_tf-0.1.0-py3-none-any.whl" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c3c123134a4f69bc4e583cd7ab4aaec0", "sha256": "0950ba4d68cec442cc8d26d9c6f3e9faacc827775b4d2556d2a29514a975ed91" }, "downloads": -1, "filename": "swarm_tf-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c3c123134a4f69bc4e583cd7ab4aaec0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13710, "upload_time": "2019-08-06T00:02:12", "url": "https://files.pythonhosted.org/packages/1a/98/075a473da82e9f21b70b811590b832281d6645f9c1963eb4a966b007d661/swarm_tf-0.2.0-py3-none-any.whl" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "962a7151b5d3bb194f7db39a0ed92cf6", "sha256": "289ff6817ac35b3d66b3416e412bd58937dee6797eb0e84453e757ea0832d357" }, "downloads": -1, "filename": "swarm_tf-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "962a7151b5d3bb194f7db39a0ed92cf6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13708, "upload_time": "2019-08-06T00:12:44", "url": "https://files.pythonhosted.org/packages/24/39/ad26a560ac58d4941416967d08b98366fa459182360aa6a4c4a88396ffb7/swarm_tf-0.2.1-py3-none-any.whl" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "512273b6c9662e590261561041615b81", "sha256": "6cfa10fc97ebcaa8a6fb9515cc3204edf23b5e867f3b9456059335f1133c160d" }, "downloads": -1, "filename": "swarm_tf-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "512273b6c9662e590261561041615b81", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13737, "upload_time": "2019-08-07T04:44:04", "url": "https://files.pythonhosted.org/packages/48/93/1300a5874afe11c4befba2c876e47894ff87fdd8ed3205f2d64c033a3394/swarm_tf-0.2.2-py3-none-any.whl" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "7eecc41926c1e9e394162ce7e8fc1f20", "sha256": "0eee8678fc64e7fbe8567a5885f1ca158ac2699451e9cbc21dd4c7cf089db95f" }, "downloads": -1, "filename": "swarm_tf-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7eecc41926c1e9e394162ce7e8fc1f20", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15450, "upload_time": "2019-08-11T04:21:57", "url": "https://files.pythonhosted.org/packages/fa/73/727c5581d8cf65777c3f44947bf8e57edbacb09d0d09a7e07b774375155c/swarm_tf-0.2.3-py3-none-any.whl" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "9f2ce915232eeb9d6235c719e66141c4", "sha256": "165a66969151f78c5f85477ad127987d6398f14aae55009277f7f01fb45d585c" }, "downloads": -1, "filename": "swarm_tf-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9f2ce915232eeb9d6235c719e66141c4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15529, "upload_time": "2019-08-19T00:58:40", "url": "https://files.pythonhosted.org/packages/fa/bd/b846e84f423d97ca604054eaab9fb49852a1f96fa1d54ca129566a04f469/swarm_tf-0.2.4-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9f2ce915232eeb9d6235c719e66141c4", "sha256": "165a66969151f78c5f85477ad127987d6398f14aae55009277f7f01fb45d585c" }, "downloads": -1, "filename": "swarm_tf-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9f2ce915232eeb9d6235c719e66141c4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15529, "upload_time": "2019-08-19T00:58:40", "url": "https://files.pythonhosted.org/packages/fa/bd/b846e84f423d97ca604054eaab9fb49852a1f96fa1d54ca129566a04f469/swarm_tf-0.2.4-py3-none-any.whl" } ] }