{ "info": { "author": "Tomas Tomecek", "author_email": "tomas@tomecek.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development", "Topic :: Utilities" ], "description": "# ansible-bender\n[![Build Status](https://dev.azure.com/nereone/ab/_apis/build/status/TomasTomecek.ansible-bender?branchName=master)](https://dev.azure.com/nereone/ab/_build/latest?definitionId=1&branchName=master)\n\nThis is a tool which bends containers using\n[Ansible](https://github.com/ansible/ansible)\n[playbooks](https://docs.ansible.com/ansible/latest/user_guide/playbooks.html)\nand turns them into container images. It has a pluggable builder selection \u2014\nit is up to you to pick the tool which will be used to construct your container\nimage. Right now the only supported builder is\n[buildah](https://github.com/containers/buildah).\n[More](http://github.com/ansible-community/ansible-bender/issues/25) [to\ncome](http://github.com/ansible-community/ansible-bender/issues/26) in the future.\nAnsible-bender (ab) relies on [Ansible connection\nplugins](https://docs.ansible.com/ansible/2.6/plugins/connection.html) for\nperforming builds.\n\ntl;dr Ansible is the frontend, buildah is the backend.\n\nThe concept is described in following blog posts:\n* [Building containers with buildah and ansible](https://blog.tomecek.net/post/building-containers-with-buildah-and-ansible/).\n* [Ansible and Podman Can Play Together Now](https://blog.tomecek.net/post/ansible-and-podman-can-play-together-now/).\n\nYou may be asking: why not\n[ansible-container](https://github.com/ansible/ansible-container)? Ansible bender is\nactually heavily inspired by ansible-container: the main distinction is that\nansible-container covers the complete lifecycle of a containerized application\nwhile ab takes care of image builds only.\n\n\n**Status**: ready to be used\n\nAnsible-bender was recently moved to the ansible-community organization. \\o/\n\n\n## Features:\n\n* You can build your container images with buildah as a backend.\n* Ansible playbook is your build recipe.\n* You are able to set various image metadata via CLI or as specific Ansible vars:\n * working directory\n * environment variables\n * labels\n * user\n * default command\n * exposed ports\n* You can do volume mounts during build.\n* Caching mechanism:\n * Every task result is cached as a container image layer.\n * You can turn this off with `--no-cache`.\n * You can disable caching from a certain point by adding a tag `no-cache` to a task.\n* You can stop creating new image layers by adding tag `stop-layering` to a task.\n* If an image build fails, it's committed and named with a suffix `-failed` (so\n you can take a look inside and resolve the issue).\n* The tool tries to find python interpreter inside the base image.\n* You can push images you built to remote locations such as:\n * a registry, a tarball, docker daemon, ...\n * [`podman push`](https://github.com/containers/libpod/blob/master/docs/podman-push.1.md) is used to perform the push.\n\n\n## Interface\n\nAnsible-bender has these commands:\n\nCommand | Description\n--------|------------\n`build` | build a new container image using selected playbook\n`list-builds` | list all builds\n`get-logs` | display build logs\n`inspect` | provide detailed metadata about the selected build\n`push` | Push images you built to remote locations.\n\n\n## Installation\n\n```\n$ pip3 install ansible-bender\n```\n\nIf you are brave enough, please install bender directly from git master:\n```\n$ pip3 install git+https://github.com/ansible-community/ansible-bender\n```\n\nIf `pip3` command is not available on your system, you can run pip like this:\n```\n$ python3 -m pip install ...\n```\n\n\n### Requirements (host)\n\nPip takes care of python dependencies, but ansible-bender also requires a few\nbinaries to be present on your host system:\n\n* [Podman](https://github.com/containers/libpod)\n* [Buildah](https://github.com/containers/buildah)\n* [Ansible](https://github.com/ansible/ansible)\n * Ansible needs to be built against python 3\n* Python 3\n\nLast two requirements can be pretty tough: you can always run bender in a\nprivileged container.\n\n\n#### Setting up buildah and podman\n\nIf you run ansible-bender as root, you don't need to set up anything. Just\ninstall the packages and you are good to go. This is the preferred way \u2014\nbuildah and podman are much more efficient when using the in-kernel overlay\nfilesystem and you will encounter [less issues than with the rootless\nmode](https://github.com/containers/libpod/blob/master/rootless.md).\n\nOn the other hand, if you want to utilize [the rootless\nmode](https://github.com/containers/libpod/blob/master/docs/podman-create.1.md#rootless-containers),\nyou need to set up the UID mapping. It is documented in\n[podman's](https://github.com/containers/libpod/blob/master/troubleshooting.md#10-podman-fails-to-run-in-user-namespace-because-etcsubuid-is-not-properly-populated)\ndocumentation. All you need to do is to add an entry into /etc/subuid and\n/etc/subgid:\n\n```bash\n$ sudo sh -c \"printf \\\"\\n$(whoami):100000:65536\\n\\\" >>/etc/subuid\"\n$ sudo sh -c \"printf \\\"\\n$(whoami):100000:65536\\n\\\" >>/etc/subgid\"\n```\n\nYou should consult [podman's troubleshooting\nguide](https://github.com/containers/libpod/blob/master/troubleshooting.md) if\nyou are running into issues.\n\n\n### Requirements (base image)\n\n* python interpreter \u2014 ansible-bender will try to find it (alternatively you\n can specify it via `--python-interpreter`).\n * It can be python 2 or python 3 \u2014 on host, you have to have python 3 but\n inside the base image, it doesn't matter \u2014 Ansible is able to utilize\n python 2 even if it's invoked with python 3 on the control machine.\n\n\n### Requirements (Ansible playbook)\n\nNone.\n\nBender copies the playbook you provide so that it can be processed. `hosts`\nvariable is being overwritten in the copy and changed to the name of the\nworking container \u2014 where the build happens. So it doesn't matter what's the\ncontent of the hosts variable.\n\n\n## Configuration\n\nYou can configure ansible-bender and set metadata on your final image, in order\nto do that, please check out [docs/configuration.md](docs/configuration.md).\n\n\n### Ansible roles\n\nIf you are using roles in your playbook and they are in a non-standard place,\nyou can utilize `ANSIBLE_ROLES_PATH` environment variable to tell ansible where\nyour roles lives. Bender does not tamper with environment variables, all are\npassed to ansible-playbook.\n\n\n## Debugging Bender\n\nIt may happen there is something wrong in your setup or the tooling Bender is\nrelying on is not in the best shape. The best way to find the root cause is to\nrun Bender in debug mode and run ansible as verbosely as possible:\n```\n$ ansible-bender --debug build --extra-ansible-args='-vvvvvv'\n```\n\n\n## Usage\n\nTyping `ansible-bender` can take some time, consider adding an alias into your\nshell rc file:\n```\nalias ab=\"ansible-bender\"\n```\n\n### Building images\n\nThere is a simple playbook present in the root of this repository to showcase the functionality:\n```bash\n$ ansible-bender build ./simple-playbook.yaml\n\nPLAY [Demonstration of ansible-bender functionality] ****************************************\n\nTASK [Gathering Facts] **********************************************************************\nok: [a-very-nice-image-20190302-153257279579-cont]\n\nTASK [Run a sample command] *****************************************************************\nchanged: [a-very-nice-image-20190302-153257279579-cont]\ncaching the task result in an image 'a-very-nice-image-20193302-153306'\n\nTASK [Stat a file] **************************************************************************\nok: [a-very-nice-image-20190302-153257279579-cont]\ncaching the task result in an image 'a-very-nice-image-20193302-153310'\n\nPLAY RECAP **********************************************************************************\na-very-nice-image-20190302-153257279579-cont : ok=3 changed=1 unreachable=0 failed=0\n\nGetting image source signatures\n\nSkipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s\n\nSkipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s\n\nSkipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s\n\nSkipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s\n\nSkipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s\n\nSkipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s\n\nSkipping blob 492c5c55da84 (already present): 4.50 KiB / 4.50 KiB [=========] 0s\n\nSkipping blob 6f55b6e55d8a (already present): 6.15 MiB / 6.15 MiB [=========] 0s\n\nSkipping blob 80ea48511c5d (already present): 1021.00 KiB / 1021.00 KiB [===] 0s\n\nCopying config 6b6dc5878fb2: 0 B / 5.15 KiB [----------------------------------]\nCopying config 6b6dc5878fb2: 5.15 KiB / 5.15 KiB [==========================] 0s\nWriting manifest to image destination\nStoring signatures\n6b6dc5878fb2c2c10099adbb4458c2fc78cd894134df6e4dee0bf8656e93825a\nImage 'a-very-nice-image' was built successfully \\o/\n```\n\nThis is how the playbook looks:\n```yaml\n---\n- name: Demonstration of ansible-bender functionality\n hosts: all\n vars:\n ansible_bender:\n base_image: python:3-alpine\n\n working_container:\n volumes:\n - '{{ playbook_dir }}:/src'\n\n target_image:\n name: a-very-nice-image\n working_dir: /src\n labels:\n built-by: '{{ ansible_user }}'\n environment:\n FILE_TO_PROCESS: README.md\n tasks:\n - name: Run a sample command\n command: 'ls -lha /src'\n - name: Stat a file\n stat:\n path: \"{{ lookup('env','FILE_TO_PROCESS') }}\"\n```\n\nAs you can see, the whole build processed is configured by the variable\n`ansible_bender`.\n\nIf we rerun the build again, we can see that ab loads every task from cache:\n```bash\n$ ansible-bender build ./simple-playbook.yaml\n\nPLAY [Demonstration of ansible-bender functionality] ****************************************\n\nTASK [Gathering Facts] **********************************************************************\nok: [a-very-nice-image-20190302-153526013757-cont]\n\nTASK [Run a sample command] *****************************************************************\nloaded from cache: '7c69668c42987446cc78adbf6620fc2faf90ad10c3497662fe38940dd6de998f'\nskipping: [a-very-nice-image-20190302-153526013757-cont]\n\nTASK [Stat a file] **************************************************************************\nloaded from cache: '4a4f54285928c03eea65745ee9feead88026c780a40126d94e79d5842bcdbe62'\nskipping: [a-very-nice-image-20190302-153526013757-cont]\n\nPLAY RECAP **********************************************************************************\na-very-nice-image-20190302-153526013757-cont : ok=1 changed=0 unreachable=0 failed=0\n\nGetting image source signatures\n\nSkipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s\n\nSkipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s\n\nSkipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s\n\nSkipping blob 492c5c55da84 (already present): 4.50 KiB / 4.50 KiB [=========] 0s\nSkipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s\nSkipping blob 6f55b6e55d8a (already present): 6.15 MiB / 6.15 MiB [=========] 0s\nSkipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s\nSkipping blob 80ea48511c5d (already present): 1021.00 KiB / 1021.00 KiB [===] 0s\nSkipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s\nSkipping blob 5f70bf18a086 (already present): 1.00 KiB / 1.00 KiB [=========] 0s\nSkipping blob 492c5c55da84 (already present): 4.50 KiB / 4.50 KiB [=========] 0s\n\nSkipping blob 6f55b6e55d8a (already present): 6.15 MiB / 6.15 MiB [=========] 0s\n\nSkipping blob 80ea48511c5d (already present): 1021.00 KiB / 1021.00 KiB [===] 0s\n\nSkipping blob 5f70bf18a086 (already present): 1.00 KiB / 1.00 KiB [=========] 0s\n\nCopying config 354752b97084: 0 B / 5.26 KiB [----------------------------------]\nCopying config 354752b97084: 5.26 KiB / 5.26 KiB [==========================] 0s\nWriting manifest to image destination\nStoring signatures\n354752b97084fcf349a28a2f66839d270e728559883dd1edb5ec22e8c9c6adb9\nImage 'a-very-nice-image' was built successfully \\o/\n```\n\n\n### Listing builds\n\nWe can list builds we have done:\n```bash\n$ ansible-bender list-builds\n BUILD ID IMAGE NAME STATUS DATE BUILD TIME\n---------- ----------------- -------- -------------------------- --------------\n 1 a-very-nice-image done 2019-03-02 16:07:47.471912 0:00:12.347721\n 2 a-very-nice-image done 2019-03-02 16:07:58.858699 0:00:06.242378\n```\n\n\n### Getting logs of a build\n\nWanna check build logs sometime later? No problem!\n```bash\n$ ansible-bender get-logs 2\n\nPLAY [Demonstration of ansible-bender functionality] *********************************\n\nTASK [Gathering Facts] ***************************************************************\nok: [a-very-nice-image-20190302-160751828671-cont]\n\nTASK [Run a sample command] **********************************************************\nloaded from cache: 'cd27cfb71a161f3333232b97cc6b2a89354ff52de71bce9058c52cdf536735f9'\nskipping: [a-very-nice-image-20190302-160751828671-cont]\n\nTASK [Stat a file] *******************************************************************\nloaded from cache: '89ba4efc31358d688f035bf8159d900f1552314f0af6bf6c338b4897da593ccf'\nskipping: [a-very-nice-image-20190302-160751828671-cont]\n\nPLAY RECAP ***************************************************************************\na-very-nice-image-20190302-160751828671-cont : ok=1 changed=0 unreachable=0 failed=0\n```\n\n\n### Locating built images with podman\n\nOnce they are built, you can use them with podman right away:\n```bash\n$ podman images a-very-nice-image\nREPOSITORY TAG IMAGE ID CREATED SIZE\nlocalhost/a-very-nice-image latest 5202048d9a0e 2 minutes ago 83.5 MB\n```\n\n\n### Buildah configuration\n\nIf you are familiar with podman and buildah, you know that you can\n[configure](https://github.com/containers/buildah/blob/master/docs/buildah.md#files)\nthese tools. Ansible-bender doesn't change this configuration in any way so\nit's up to you how you set up buildah and podman. The same applies for running\nansible-bender as root or not: buildah allows you to utilize rootless\ncontainers.\n\nMy suggestion is to use the overlay storage backend. Vfs backend is slow and\ninefficient.\n\n\n### Caching mechanism\n\nAnsible bender has a caching mechanism. It is enabled by default. ab caches\ntask results (=images). If a task content did not change and the base image is\nthe same, the layer is loaded from cache instead of being processed again. This\ndoesn't work correctly with tasks which process file: ab doesn't handle files\nyet.\n\nYou are able to control caching in two ways:\n\n * disable it completely by running `ab build --no-cache`\n * or adding a tag to your task named `no-cache` \u2014 ab detects such tag and\n will not try to load from cache\n\n\n### Layering mechanism\n\nWhen building your image by default, every task (except for setup) is being\ncached as an image layer. This may have bad consequences on storage and\nsecurity: there may be things which you didn't want to have cached nor stored\nin a layer (certificates, package manager metadata, build artifacts).\n\nab allows you to easily disable layering mechanism. All you need to do is to\nadd a tag `stop-layering` to a task which will disable layering (and caching)\nfor that task and all the following ones.\n\n\n### Ansible-bender in OKD\n\nRecently I started experimenting with running ab inside [OpenShift\norigin](https://github.com/openshift/origin) \u2014 imagine that you'd be able to\nbuild images in your cluster, using Ansible playbooks as definitions.\n\nOpenshift by default runs its pods in a\n[restrictive](https://blog.openshift.com/understanding-service-accounts-sccs/)\nenvironment. In the proof of concept I was forced to run ab in a privileged\npod. In the end, the whole test suite is passing in that privileged pod.\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/TomasTomecek/ansible-bender", "keywords": "ansible,containers,linux,buildah", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ansible-bender", "package_url": "https://pypi.org/project/ansible-bender/", "platform": "", "project_url": "https://pypi.org/project/ansible-bender/", "project_urls": { "Homepage": "https://github.com/TomasTomecek/ansible-bender" }, "release_url": "https://pypi.org/project/ansible-bender/0.7.0/", "requires_dist": [ "PyYAML", "tabulate", "jsonschema", "pytest ; extra == 'testing'", "flexmock ; extra == 'testing'" ], "requires_python": ">=3.6", "summary": "A tool which builds container images using Ansible playbooks", "version": "0.7.0" }, "last_serial": 5325740, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "03f401a08a68546afe0db17892d8c3a3", "sha256": "b11d54fbffd0141b98b3963cac3c7d439e701642b07705f2210df5ce5f4d1e56" }, "downloads": -1, "filename": "ansible_bender-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "03f401a08a68546afe0db17892d8c3a3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 32421, "upload_time": "2018-11-09T10:16:58", "url": "https://files.pythonhosted.org/packages/a6/e9/dc7c330662cccfc2a975a3ebd874981e5ff960a592ae05f75d6d0f232ca8/ansible_bender-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eb08ac09f3f03c83ed757fb6bb88d9be", "sha256": "95c9435bbf701185ce3f22f533ec35ee7fd9dd8740ae4f13f04eb20849f87e12" }, "downloads": -1, "filename": "ansible-bender-0.2.0.tar.gz", "has_sig": false, "md5_digest": "eb08ac09f3f03c83ed757fb6bb88d9be", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 28950, "upload_time": "2018-11-09T10:16:59", "url": "https://files.pythonhosted.org/packages/97/26/f662011d128103c3901c48361f8b91045fc600896cab38956b006c0aea22/ansible-bender-0.2.0.tar.gz" } ], "0.2.0.dev0": [ { "comment_text": "", "digests": { "md5": "cafd48a4c1cac6f10269ffc4d208ce2b", "sha256": "98f0337d3dccf08aa9f62f0be8f2187f34bc9517ffbd2a6b14ad00413346fbbe" }, "downloads": -1, "filename": "ansible_bender-0.2.0.dev0-py3-none-any.whl", "has_sig": false, "md5_digest": "cafd48a4c1cac6f10269ffc4d208ce2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14867, "upload_time": "2018-08-28T12:24:52", "url": "https://files.pythonhosted.org/packages/23/ce/07fa8cd91f50338c7d30dad5653fe02f8399ed8191b85b2f1a6919f95db7/ansible_bender-0.2.0.dev0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1422529bd05066d021ba202edd10bf55", "sha256": "d2966d538158eab4e242e55f591c5a135a12b370b1825f5e5d5e2ec90543096e" }, "downloads": -1, "filename": "ansible-bender-0.2.0.dev0.tar.gz", "has_sig": false, "md5_digest": "1422529bd05066d021ba202edd10bf55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13369, "upload_time": "2018-08-28T12:24:54", "url": "https://files.pythonhosted.org/packages/f2/4c/2885c1803f3a8013e44d335bf04e577f8a930e212eaf8e9879e9efd04db0/ansible-bender-0.2.0.dev0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "7dc58f99dbaa23e3b757401a7f451610", "sha256": "2955d92819da8a8a34364a0c4004ff2bc8e68fe47179b144741f887830f27e59" }, "downloads": -1, "filename": "ansible_bender-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7dc58f99dbaa23e3b757401a7f451610", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 32715, "upload_time": "2018-11-10T13:11:10", "url": "https://files.pythonhosted.org/packages/80/95/597befb4336187e54415b116fce4830c48c95ead06efce03d312125e1bb3/ansible_bender-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "edfa239f3815606ba18172d82a4045b0", "sha256": "7d03a27b8ec0c612765c1a87a153e4b9f4ed5639ef70cd1ab2a5d3f829d1464d" }, "downloads": -1, "filename": "ansible-bender-0.2.1.tar.gz", "has_sig": false, "md5_digest": "edfa239f3815606ba18172d82a4045b0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 29236, "upload_time": "2018-11-10T13:11:12", "url": "https://files.pythonhosted.org/packages/f1/bb/0242d00293194d5a764b0c5739eb8033e9a47185b70f4b50ceb8a7ae4c31/ansible-bender-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "dcb68edb52c11f8e68b153471785e597", "sha256": "0c0afaf7b37aa4c7d35a6d31e5b3de183692edb3f75df5dab8e721539a7d0551" }, "downloads": -1, "filename": "ansible_bender-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dcb68edb52c11f8e68b153471785e597", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 33862, "upload_time": "2018-11-18T16:51:59", "url": "https://files.pythonhosted.org/packages/3d/c7/42ea9c8eae950e307ff074424890460e24c35b2a3bc66ca8cb56008017fc/ansible_bender-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12cf80774887a8c488a361bcf6c52203", "sha256": "bae5ab6217fc369cc5ea2a56f48550b3c3146d738e0a78153d21a1f5d1f557d1" }, "downloads": -1, "filename": "ansible-bender-0.3.0.tar.gz", "has_sig": false, "md5_digest": "12cf80774887a8c488a361bcf6c52203", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 30066, "upload_time": "2018-11-18T16:52:01", "url": "https://files.pythonhosted.org/packages/a4/ef/1c212e4121c0a803006e51ef4ec621380f5ffd7f22699b7206445298bdff/ansible-bender-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "479a394d96ed8d34cbe59de3a2dd903a", "sha256": "bb05e1b64ecf277f9d46531871fd1d95122722020a6649718394ae37ce4cfc45" }, "downloads": -1, "filename": "ansible_bender-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "479a394d96ed8d34cbe59de3a2dd903a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 27752, "upload_time": "2018-12-13T14:27:26", "url": "https://files.pythonhosted.org/packages/18/14/bfab2b44258145eefa41dc865a55bb3e36fb0fa5836361c901462b563e17/ansible_bender-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4010c650b882eeb633f6b731c1fc78ac", "sha256": "42a78a067e21e9e4ebe07f410521e88846d4967a17d28197a8dd5d4ab9a0491a" }, "downloads": -1, "filename": "ansible-bender-0.3.1.tar.gz", "has_sig": false, "md5_digest": "4010c650b882eeb633f6b731c1fc78ac", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 34069, "upload_time": "2018-12-13T14:27:28", "url": "https://files.pythonhosted.org/packages/f3/86/2f6eaaab4040e6cc901ae7bdcac5c5b1ff422cf8334abc6059e3802579c6/ansible-bender-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "fb5126cb58489cf322840191f82e9a7a", "sha256": "0f9cfb23bdfcf0ab892e8139972cbd574020efb5c4d4a32b7e878aa78fab2151" }, "downloads": -1, "filename": "ansible_bender-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fb5126cb58489cf322840191f82e9a7a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 29522, "upload_time": "2019-01-11T10:50:16", "url": "https://files.pythonhosted.org/packages/8a/b5/e816e6b39baf9561f9a2c8fea420bd8312e071bfaae698d87959ef8174c4/ansible_bender-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4f1ee2d7348e2219f24ec5a169aa4d56", "sha256": "95813bf30eaefe0bdb4bd0277168f743204c9ffe878dfa66a6f4a7b319fc7ae4" }, "downloads": -1, "filename": "ansible-bender-0.3.2.tar.gz", "has_sig": false, "md5_digest": "4f1ee2d7348e2219f24ec5a169aa4d56", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 39500, "upload_time": "2019-01-11T10:50:18", "url": "https://files.pythonhosted.org/packages/51/9c/b5eac0dbe116ad9ac599505a2b4769ff152221bd2902d75b87beb71e679b/ansible-bender-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "48b64ce495a6758c9ea2511fce78f32e", "sha256": "60939646bc3e023b95e1f195c03438421992d3ac541623d8f09b205d193a345e" }, "downloads": -1, "filename": "ansible_bender-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "48b64ce495a6758c9ea2511fce78f32e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 30250, "upload_time": "2019-01-28T21:49:03", "url": "https://files.pythonhosted.org/packages/fa/5c/04c822b3ee6e2ff41eed372f15d954cccf164d0340341fbd0270d500bb83/ansible_bender-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8292e86fe5f2977bcd0fd8116206616e", "sha256": "ccf85a16280450e184e6f7dc237b5ace1b8e111e06a479fb0595b7016344e4cd" }, "downloads": -1, "filename": "ansible-bender-0.4.0.tar.gz", "has_sig": false, "md5_digest": "8292e86fe5f2977bcd0fd8116206616e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 42883, "upload_time": "2019-01-28T21:49:05", "url": "https://files.pythonhosted.org/packages/06/cc/f9757f6e47b512c5e736fd350a0c98ef510859dac79db3423e1bc3fa36a9/ansible-bender-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "69cfc1d9eb0790d9a978f73f76e6f689", "sha256": "f7f499cbeac01a317f87ae611b9d6e5d9464c704fd8fe48e7589d27c37908662" }, "downloads": -1, "filename": "ansible_bender-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "69cfc1d9eb0790d9a978f73f76e6f689", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 35703, "upload_time": "2019-03-02T15:34:41", "url": "https://files.pythonhosted.org/packages/a8/4c/dc50869f6cb8ebe0d1eea388d496c6c8fda1058820c2552dbe26215b5da7/ansible_bender-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "21bd70912e5b3807eced78fb02412af8", "sha256": "7f3267c5ca5fd18c41306bce40555e369254ad74cfffd09e5746e3a7484b8a13" }, "downloads": -1, "filename": "ansible-bender-0.5.0.tar.gz", "has_sig": false, "md5_digest": "21bd70912e5b3807eced78fb02412af8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 53846, "upload_time": "2019-03-02T15:34:42", "url": "https://files.pythonhosted.org/packages/7b/e9/2ef427eaf7f26fe331e1aa05885cd080756248a02b28f565c1a3255ed1e7/ansible-bender-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "fcc5ab90d0709361a9f2c2d429e86a2c", "sha256": "e355b48ad7fccd242ae623208b571862806adfe9ebc454a320b5d357ec1307b9" }, "downloads": -1, "filename": "ansible_bender-0.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fcc5ab90d0709361a9f2c2d429e86a2c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 36327, "upload_time": "2019-03-18T21:16:54", "url": "https://files.pythonhosted.org/packages/da/c2/9d4fd7e7e993e6526517058b454f39365a909fe9cf9b3fc5137a1109dded/ansible_bender-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc6b85db7814a988761fe5737598bf54", "sha256": "c1fd8cd5bc5234bcbd927a479c73f99b26f4321629269b84f7aa6647f2ec2d1f" }, "downloads": -1, "filename": "ansible-bender-0.5.1.tar.gz", "has_sig": false, "md5_digest": "fc6b85db7814a988761fe5737598bf54", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 55153, "upload_time": "2019-03-18T21:16:55", "url": "https://files.pythonhosted.org/packages/e3/ab/679c622876c253cb4d9be70ed9432030c41c82d68e08c70595f45ed26095/ansible-bender-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "71edba6f4ec327611ddbde428765c81e", "sha256": "a7a0c571c2218a1e030cd2a0da3fe1d71ed766e55ea822158e5e48b321fcff81" }, "downloads": -1, "filename": "ansible_bender-0.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "71edba6f4ec327611ddbde428765c81e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 36884, "upload_time": "2019-04-05T16:29:45", "url": "https://files.pythonhosted.org/packages/24/ad/35fa0dd927e6e0adfb9832a0ebf564b63be2eb3c60fee3b7fc64706582f5/ansible_bender-0.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "acf94a91e041fc057eab27c3b144dec3", "sha256": "81fa28306dc8f45415b4b2484b9601aff6f2962b67755d26e3680e39860476ab" }, "downloads": -1, "filename": "ansible-bender-0.5.2.tar.gz", "has_sig": false, "md5_digest": "acf94a91e041fc057eab27c3b144dec3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 56920, "upload_time": "2019-04-05T16:29:47", "url": "https://files.pythonhosted.org/packages/85/a5/19552f98d96df460a8b3ce95967fd23a778ad5f69c7403ba54311146ed57/ansible-bender-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "17fe788cefc3505af6dd36cc26a87a8f", "sha256": "965530de2556eac77fd46280656876943046041d48487cfa5eaee3eed2999dcf" }, "downloads": -1, "filename": "ansible_bender-0.5.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "17fe788cefc3505af6dd36cc26a87a8f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 37040, "upload_time": "2019-04-14T08:51:18", "url": "https://files.pythonhosted.org/packages/3a/da/3dd500747e722aaaf5e9ea7ac255cb761815ff7e5cf7187dfaf9b53fb971/ansible_bender-0.5.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f158ab373e894a5a1ffcc783dbd3264b", "sha256": "5f8b5460f801c67a82501db334d15e4ac56d7ae203a99779d3da85646edde8ab" }, "downloads": -1, "filename": "ansible-bender-0.5.3.tar.gz", "has_sig": false, "md5_digest": "f158ab373e894a5a1ffcc783dbd3264b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 57663, "upload_time": "2019-04-14T08:51:20", "url": "https://files.pythonhosted.org/packages/93/39/54b94c0e363c374b8544309b0de404c52efc5d5f45c171acb065b8e41a19/ansible-bender-0.5.3.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "fd38570a9d958475958ec77ea6f521d1", "sha256": "2950f22ef8950434c8c9de11525bb9b04aa2c7a8e8686e426f51b7e9942a50cb" }, "downloads": -1, "filename": "ansible_bender-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fd38570a9d958475958ec77ea6f521d1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 37121, "upload_time": "2019-05-14T07:22:46", "url": "https://files.pythonhosted.org/packages/0c/3b/e1ea43da2827387c9f8bc7ef22f7723346db467dcec7dd5c49fd4df3840c/ansible_bender-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49470fa77310f22824d23f49326c2bfd", "sha256": "574cd4fab175d12a6692714ae8e17418f9ee74fd78aae078e6f6edf03307f4cd" }, "downloads": -1, "filename": "ansible-bender-0.6.0.tar.gz", "has_sig": false, "md5_digest": "49470fa77310f22824d23f49326c2bfd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 57929, "upload_time": "2019-05-14T07:22:49", "url": "https://files.pythonhosted.org/packages/eb/4e/3e9b6a2890a5c50f20abbf483b83800fcb8a6869a7690725fe9083d70916/ansible-bender-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "97e554c80d6e690aca129484e2957dee", "sha256": "3d6886d11aaee908f0f110aaee277a07422afdc40d6211456eacea666689ec0c" }, "downloads": -1, "filename": "ansible_bender-0.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "97e554c80d6e690aca129484e2957dee", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 37225, "upload_time": "2019-05-25T08:07:10", "url": "https://files.pythonhosted.org/packages/a6/b6/9695e47ba06a25b9acaba6c891ac1246bebbb0dcca018f0b45a4cca7dc7b/ansible_bender-0.6.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c0d1b8f8ee0fa600566e663efac0bd3", "sha256": "812f0cff2030a92251b515a3670c6a795292ccdd962d6004af3f70c4b7a701da" }, "downloads": -1, "filename": "ansible-bender-0.6.1.tar.gz", "has_sig": false, "md5_digest": "4c0d1b8f8ee0fa600566e663efac0bd3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 58463, "upload_time": "2019-05-25T08:07:12", "url": "https://files.pythonhosted.org/packages/cb/ed/22de54630b1ae9d281cc84a0f8744fe3cf250670354be0e674112f6230cb/ansible-bender-0.6.1.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "66d02338175adf0ddd839f767158bba2", "sha256": "f005870dfce6794d5f1b20ed738bc8abaca427cfc9b3128e3bc5c06c7c7acd9a" }, "downloads": -1, "filename": "ansible_bender-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "66d02338175adf0ddd839f767158bba2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 37579, "upload_time": "2019-05-28T08:48:19", "url": "https://files.pythonhosted.org/packages/b3/1d/f0c3c13c0a24c8949e53c77b46aab6d98d539c15f2c30978ffc4642c501e/ansible_bender-0.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "945632aecf439e7322bb574f21dc4125", "sha256": "231c28fd31c687df85e8b9272f7cb0db71e5023d69614b09e97ffc7b0cb65db2" }, "downloads": -1, "filename": "ansible-bender-0.7.0.tar.gz", "has_sig": false, "md5_digest": "945632aecf439e7322bb574f21dc4125", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 59116, "upload_time": "2019-05-28T08:48:21", "url": "https://files.pythonhosted.org/packages/b4/05/564464a5ad4cdd97c0b7b78ba8cb8049bcb2464f59a274ccafd42f05a573/ansible-bender-0.7.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "66d02338175adf0ddd839f767158bba2", "sha256": "f005870dfce6794d5f1b20ed738bc8abaca427cfc9b3128e3bc5c06c7c7acd9a" }, "downloads": -1, "filename": "ansible_bender-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "66d02338175adf0ddd839f767158bba2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6", "size": 37579, "upload_time": "2019-05-28T08:48:19", "url": "https://files.pythonhosted.org/packages/b3/1d/f0c3c13c0a24c8949e53c77b46aab6d98d539c15f2c30978ffc4642c501e/ansible_bender-0.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "945632aecf439e7322bb574f21dc4125", "sha256": "231c28fd31c687df85e8b9272f7cb0db71e5023d69614b09e97ffc7b0cb65db2" }, "downloads": -1, "filename": "ansible-bender-0.7.0.tar.gz", "has_sig": false, "md5_digest": "945632aecf439e7322bb574f21dc4125", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 59116, "upload_time": "2019-05-28T08:48:21", "url": "https://files.pythonhosted.org/packages/b4/05/564464a5ad4cdd97c0b7b78ba8cb8049bcb2464f59a274ccafd42f05a573/ansible-bender-0.7.0.tar.gz" } ] }