Buildout does not install setup.scripts, even with zc.recipe.egg:scripts #24

Closed
specialunderwear opened this Issue Oct 15, 2012 · 44 comments

Comments

Projects
None yet
10 participants

http://pypi.python.org/pypi/zc.recipe.egg/1.3.2#script-generation does not work.

You can verify this with the following test package: http://pypi.python.org/pypi/tompoes/0.0.2.

It seems zc.buildout.easy_install isn't doing it's work properly.

There is one more issue, which might or might not be related. In any case, the example package has only 1 module; tompoes.py. This module is NOT installed. That means the endpoint tom isn't working!

Since I've got no idea if this bug is caused by the failure to install scripts, I added it to this ticket instead of creating a separate issue.

Member

mgedmin commented Oct 15, 2012

The part where zc.buildout ignores old-style distutils scripts was reported at https://bugs.launchpad.net/zc.buildout/+bug/422724. zc.buildout 1.x never supported that (which is a shame), zc.buildout 2 will support it when it finally gets released.

The part where your console script entry point fails is a bug in your package: tompoes-0.0.2.tar.gz defines an entry point for tompoes.main(), but doesn't contain a tompoes.py or a tompoes/__init__.py. If you had any of those in your source tree, check your MANIFEST.in and/or install the appropriate setuptools plugins for version control integration.

Member

mgedmin commented Oct 15, 2012

Sorry, I had a brainfart: MANIFEST.in doesn't influence which Python source files are or are not included in your sdist. The problem lies with your setup.py: find_packages() didn't find your package for some reason. Find out why.

Haha sorry for the missing tompoes.py. It wasn' t in version control so it didn't get added to the package. It worked in my virtualenv because I did setup.py develop. :(

Is launchpad the preferred place to report bugs?

Member

mgedmin commented Oct 16, 2012

If you've a module and not a package, use setup(..., py_modules=['tompoes'], ...).

Launchpad was the old bug tracker. Github is the new one.

Contributor

reinout commented Dec 29, 2012

Just to confirm: console_scripts and old-style distutils scripts all work in buildout 2. Buildout 2's zc.recipe.egg also supports a "dependent-scripts = true" option which means that you can let buildout install all the scripts of python packages you depend upon. So if your setup.py has an install_requires on "pep8" and "docutils", their scripts get created automatically. Hurray!

Here's a snippet from my buildout:

[buildout]
parts = console_scripts
develop = .
eggs = tools
# That "tools" is a mostly only a setup.py with dependencies and a couple of scripts.

[console_scripts]
recipe = zc.recipe.egg
dependent-scripts = true
eggs =
    ${buildout:eggs}

(Comment: I think the ticket can be closed)

Contributor

domenkozar commented Dec 29, 2012

Is anyone willing to prepare a patch for 1.6.x branch?

Contributor

reinout commented Dec 29, 2012

The original distutils-style-scripts patch is still in svn: zc.buildout/branches/reinout-scripts. You could try applying that on 1.6.

But I suspect nobody is going to do the 1.6 work. Getting 2.0 out of the door is enough work. 1.5/1.6 is a dead end (at least, that's what I gathered from various discussions).

Member

aclark4life commented Dec 29, 2012

1.5 is dead. < 2 >= 1.6 (less than 2, greater than or equal to 1.6) will be supported as long as it needs to be. Last I heard @jimfulton was going to release a 1.7

Contributor

fschulze commented Feb 23, 2013

I still can't get this to work. I tried with buildout 2.0.1 and zc.recipe.egg 2.0.0a3. I last tried it with http://github.com/ralsina/nikola. Unfortunately I can't use manual entry points either, because the scripts there aren't in an importable module.

Contributor

reinout commented Feb 24, 2013

I made a clone of that nikola repo and added a buildout.cfg next to the setup.py:

[buildout]
show-picked-versions = true
parts = console_scripts
develop = .

[console_scripts]
recipe = zc.recipe.egg
dependent-scripts = true
eggs =
    Nikola

Then I ran buildout:

$ wget http://downloads.buildout.org/2/bootstrap.py
$ python bootstrap.py
Creating directory '/private/tmp/nikola/bin'.
Creating directory '/private/tmp/nikola/parts'.
Creating directory '/private/tmp/nikola/develop-eggs'.
Generated script '/private/tmp/nikola/bin/buildout'.

$ bin/buildout
Getting distribution for 'distribute'.
Got distribute 0.6.35.
Upgraded:
  distribute version 0.6.35;
restarting.
Generated script '/private/tmp/nikola/bin/buildout'.
Develop: '/private/tmp/nikola/.'
Installing console_scripts.
Getting distribution for 'configparser'.
Got configparser 3.3.0r2.
Getting distribution for 'pytz'.
Got pytz 2012j.
Getting distribution for 'PyRSS2Gen'.
zip_safe flag not set; analyzing archive contents...
Got PyRSS2Gen 1.1.
Getting distribution for 'yapsy'.
Got Yapsy 1.9.2.
Getting distribution for 'lxml'.
Building lxml version 3.1.0.
Getting distribution for 'macfsevents'.
The required version of distribute (>=0.6.34) is not available,
and can't be installed while this script is running. Please
install a more recent version first, using
'easy_install -U distribute'.

(Currently using distribute 0.6.28 (/Library/Python/2.7/site-packages/distribute-0.6.28-py2.7.egg))
error: Setup script exited with 2
An error occured when trying to install MacFSEvents 0.3. Look above this message for any errors that were output by easy_install.
While:
  Installing console_scripts.
  Getting distribution for 'macfsevents'.
Error: Couldn't install: MacFSEvents 0.3

The error is in https://github.com/malthe/macfsevents/blob/master/setup.py#L4
of macfsevents, which is a dependency of doit dependency. It calls
use_setuptools() which disregards all python paths that buildout sets and
tries to install distribute globally.

When I commented out the doit dependency in the setup.py, the buildout completes:

$ bin/buildout
Develop: '/private/tmp/nikola/.'
Installing console_scripts.
Generated script '/private/tmp/nikola/bin/pygmentize'.
Generated script '/private/tmp/nikola/bin/mako-render'.
Generated script '/private/tmp/nikola/bin/rst2html.py'.
Generated script '/private/tmp/nikola/bin/rst2latex.py'.
Generated script '/private/tmp/nikola/bin/rst2man.py'.
Generated script '/private/tmp/nikola/bin/rst2odt.py'.
Generated script '/private/tmp/nikola/bin/rst2odt_prepstyles.py'.
Generated script '/private/tmp/nikola/bin/rst2pseudoxml.py'.
Generated script '/private/tmp/nikola/bin/rst2s5.py'.
Generated script '/private/tmp/nikola/bin/rst2xetex.py'.
Generated script '/private/tmp/nikola/bin/rst2xml.py'.
Generated script '/private/tmp/nikola/bin/rstpep2html.py'.
Generated script '/private/tmp/nikola/bin/pilconvert.py'.
Generated script '/private/tmp/nikola/bin/pildriver.py'.
Generated script '/private/tmp/nikola/bin/pilfile.py'.
Generated script '/private/tmp/nikola/bin/pilfont.py'.
Generated script '/private/tmp/nikola/bin/pilprint.py'.

Hey, there's no bin/nikola, which is the script defined by nikola! So you're right that something's not working.

Nikola.egg-info/SOURCES.txt contains scripts/nikola alright, so that's not
the problem.

There's no scripts dir inside the egg-info dir, though. This is what buildout
uses to detect scripts.

When I install it in a virtualenv, easy_install does create the bin/nikola
script. And a
/private/tmp/nikola/lib/python2.7/site-packages/Nikola-5.3-py2.7.egg/EGG-INFO/scripts/
directory. So something's not right. I tried it with a distribute virtualenv
and that also worked.

I don't know right now. Why would distribute (when used from within buildout)
not pick up the script?

I must say that this is a really elaborate setup.py. I don't know all the
stuff that happens in here.

pwaller commented Apr 7, 2013

@reinout, I'm suffering from the same problem. pip install generates the script, buildout does not. I'm on buildout 2.1.0.

works for me now, thanks!

I found another bug, while it now seems to work properly with eggs installed from pypi, it does not work when installed from a source::

[sources]
tompoes = git file:///Users/henk/Sites/tompoes

[tompoes]
recipe = zc.recipe.egg:scripts
eggs =
    tompoes
dependent-scripts = true
Contributor

tseaver commented Jan 21, 2015

@specialunderwear, the [sources] section is only meaningful to the mr.developer extension, and is used to tell the extension where to find remote repositories. You don't need it for "local" ones -- I would spell your config above as:

[buildout]
develop =
    /Users/henk/Sites/tompoes
parts =
    tompoes

[tompoes]
recipe = zc.recipe.egg:scripts
eggs =
    tompoes
dependent-scripts = true

Good point, it could be a bug in mr.developer. Needless to say the same problem occurs with real remote sources. I will test if the script is properly installed as a local source, the way you demonstrate.

Contributor

tseaver commented Jan 21, 2015

Can you post a gist of the full buildout.cfg that reproduces your problem? Ideally, it would point to a git checkout from a public repository.

Also does not work with

[buildout]
develop =
    /Users/henk/Sites/tompoes
parts =
    tompoes

[tompoes]
recipe = zc.recipe.egg:scripts
eggs =
    tompoes
dependent-scripts = true

Will push tompoes to github and create a minimal buildout.cfg

Look here: https://github.com/specialunderwear/tompoes
I created several buildout configurations and a test script that tests them all.

Only the egg variant install the script.

Contributor

tseaver commented Jan 21, 2015

I tried it out (manually, before seeing test.sh). bin/tom_main works with all four configs for me: https://gist.github.com/tseaver/67057d84ba273f817ed2

bin/tom (the "raw distutils" variant, not based on the setuptools console_scripts entry point) is never installed except in the egg.cfg case.

indeed.

visik7 commented Oct 13, 2015

Any update on this issue ?
I cannot work with ansible checkout since it use setup.scripts instead of entry_points

Contributor

reinout commented Oct 13, 2015

I finally understand what's happening. Buildout itself gained the option to install distutils scripts (in easy_install.py, def scripts()). So it works if buildout itself installs an egg, for instance with the develop = . like in the first example.

In the other three, failing, examples, zc.recipe.egg's method is called and that one doesn't support distutils scripts yet!

I don't know why buildout doesn't use the zc.recipe.egg one itself. Probably a bootstrap issue? Anyway, it shouldn't be too hard to fix now that the issue is known.

Contributor

reinout commented Oct 13, 2015

Actually, I need to look even deeper into this: zc.recipe.egg calls buildout's script() method, so ideally it should just work... :-)

Contributor

reinout commented Oct 13, 2015

Hm... When trying to create the scripts, buildout grabs the "dist" of the requirement (in this case of "tompoes"):

dist = working_set.find(req)
for name in pkg_resources.get_entry_map(dist, 'console_scripts'):
    # yeah, it finds the console_scripts entry points just fine
if dist.metadata_isdir('scripts'):
    # This only gets a correct list of scripts if the dist is the package being installed explicitly.
    # In other cases, setuptools returns an empty list

So... there's the problem. I don't know the exact cause.

@visik7: installing ansible (including getting a bin/ansible and bin/ansible-playbook script) works fine if I have something like this in my buildout:

[console_scripts]
recipe = zc.recipe.egg
dependent-scripts = true
eggs =
    ${buildout:eggs}
    ansible

Does that help you?

visik7 commented Oct 13, 2015

no I tried almost anything and there is no way to get the ansible master produce correctly the scripts inside bin

visik7 commented Oct 13, 2015

this is my buildout.cfg

[buildout]
show-picked-versions = true

log-level = DEBUG
develop = develop-recipes
extends =
    base.cfg

parts +=
    aws-cli
    doxee-ansible-tools
    dev-tools
    ansible

extensions = mr.developer
auto-checkout = 
    doxee.ansible-tools
    biodec.troposphere
    ansible


[dev-tools]
recipe = zc.recipe.egg
eggs =
     ipython
     ipdb
extra-paths = 
     ${omelette:location}
     ${buildout:eggs-directory}/zc.buildout-2.4.4-py2.7.egg
     ${buildout:develop}

[omelette]
recipe = collective.recipe.omelette
eggs = 
 ${doxee-ansible-tools:eggs}
 ${dev-tools:eggs}

[sources]
doxee.ansible-tools = git https://fang.hogwarts.local/doxee-platform/doxee.ansible-tools.git
biodec.troposphere = git https://github.com/albeus/troposphere.git rev=1.1.1.post1
ansible = git https://github.com/ansible/ansible.git rev=v2.0.0-0.3.beta1

[ansible]
recipe = zc.recipe.egg
dependent-scripts = true
scripts = ansible ansible-playbook
eggs =
    ansible == 2.0.0
    boto
#extra-paths=
#       ${buildout:directory}/src/ansible/bin
#       ${buildout:directory}/src/ansible/lib
entry-points = ansible=ansible:main

[doxee-ansible-tools]
recipe = zc.recipe.egg
eggs = doxee.ansible-tools
interpreter = python-test

[aws-cli]
recipe = biodec.aws.multi
aws_credentials_file = ${buildout:directory}/aws_credentials.ini

visik7 commented Oct 13, 2015

even if I add ${buildout:eggs} in ansible eggs doesn't change anything

visik7 commented Oct 13, 2015

I also tried creating a part called
console_scripts
nothing changes

visik7 commented Oct 13, 2015

Here the output of bin/buildout -vvvvvvv

Installing 'mr.developer'.
We have the distribution that satisfies 'mr.developer==1.31'.
mr.developer: Queued 'ansible' for checkout.
mr.developer: Queued 'biodec.troposphere' for checkout.
mr.developer: Queued 'doxee.ansible-tools' for checkout.
mr.developer: Skipped checkout of existing package 'ansible'.
mr.developer: Skipped checkout of existing package 'biodec.troposphere'.
mr.developer: Skipped checkout of existing package 'doxee.ansible-tools'.
Installing 'zc.buildout', 'setuptools'.
We have the distribution that satisfies 'zc.buildout==2.4.4'.
We have the distribution that satisfies 'setuptools==16.0'.
Adding find link 'https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790' from setuptools 16.0
Adding find link 'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2' from setuptools 16.0
Develop: '/home/centos/installation-scripts/installation/develop-recipes'
in: '/home/centos/installation-scripts/installation/develop-recipes'
/home/centos/.virtualenvs/auto-aws/bin/python /tmp/tmpCXryzf -q develop -mxN -d /home/centos/installation-scripts/installation/develop-eggs/tmpxGR8kJbuild
Develop: '/home/centos/installation-scripts/installation/src/doxee.ansible-tools'
in: '/home/centos/installation-scripts/installation/src/doxee.ansible-tools'
/home/centos/.virtualenvs/auto-aws/bin/python /tmp/tmpIB8QPP -q develop -mxN -d /home/centos/installation-scripts/installation/develop-eggs/tmpPAUZxpbuild
Develop: '/home/centos/installation-scripts/installation/src/biodec.troposphere'
in: '/home/centos/installation-scripts/installation/src/biodec.troposphere'
/home/centos/.virtualenvs/auto-aws/bin/python /tmp/tmp9JoHKQ -q develop -mxN -d /home/centos/installation-scripts/installation/develop-eggs/tmpvsfJCgbuild
warning: no files found matching 'README.md'
Develop: '/home/centos/installation-scripts/installation/src/ansible'
in: '/home/centos/installation-scripts/installation/src/ansible'
/home/centos/.virtualenvs/auto-aws/bin/python /tmp/tmpkdNtkj -q develop -mxN -d /home/centos/installation-scripts/installation/develop-eggs/tmpmk_jOybuild
no previously-included directories found matching 'v2'
no previously-included directories found matching 'docsite'
no previously-included directories found matching 'ticket_stubs'
no previously-included directories found matching 'test'
no previously-included directories found matching 'hacking'
no previously-included directories found matching 'lib/ansible/modules/core/.git'
no previously-included directories found matching 'lib/ansible/modules/extras/.git'
Installing 'zc.recipe.egg'.
We have the distribution that satisfies 'zc.recipe.egg==2.0.1'.
Installing 'z3c.recipe.mkdir'.
We have the distribution that satisfies 'z3c.recipe.mkdir==0.6'.
Installing 'z3c.recipe.filetemplate'.
We have the distribution that satisfies 'z3c.recipe.filetemplate==2.2.0'.
Installing 'biodec.aws.multi'.
We have a develop egg: biodec.aws.multi 0.0.0
!!!!!! WARNING: Credential file unreadable. Skipping awscli scripts generation. !!!!!
Installing 'collective.recipe.omelette'.
We have the distribution that satisfies 'collective.recipe.omelette==0.16'.

Configuration data:
[_mr.developer]
_b = /home/centos/installation-scripts/installation/bin
_d = /home/centos/installation-scripts/installation/develop-eggs
_e = /home/centos/installation-scripts/installation/eggs
bin-directory = /home/centos/installation-scripts/installation/bin
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
eggs = mr.developer
eggs-directory = /home/centos/installation-scripts/installation/eggs
recipe = zc.recipe.egg
[aws-cli]
aws_credentials_file = /home/centos/installation-scripts/installation/aws_credentials.ini
recipe = biodec.aws.multi
[buildout]
allow-hosts = *
allow-picked-versions = true
auto-checkout =     doxee.ansible-tools
        biodec.troposphere
    %(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)sansible
bin-directory = /home/centos/installation-scripts/installation/bin
develop = develop-recipes
    src/doxee.ansible-tools
    src/biodec.troposphere
    src/ansible
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
directory = /home/centos/installation-scripts/installation
eggs = 
eggs-directory = /home/centos/installation-scripts/installation/eggs
executable = /home/centos/.virtualenvs/auto-aws/bin/python
extensions = mr.developer
find-links = 
install-from-cache = false
installed = /home/centos/installation-scripts/installation/.installed.cfg
log-format = 
log-level = DEBUG
newest = true
offline = false
parts = _mr.developer roles src templates python aws-cli doxee-ansible-tools dev-tools console_scripts
parts-directory = /home/centos/installation-scripts/installation/parts
prefer-final = true
python = buildout
show-picked-versions = true
socket-timeout = 
sources-dir = /home/centos/installation-scripts/installation/src
update-versions-file = versions/last-versions.cfg
use-dependency-links = true
verbosity = 70
versions = versions
[console_scripts]
_b = /home/centos/installation-scripts/installation/bin
_d = /home/centos/installation-scripts/installation/develop-eggs
_e = /home/centos/installation-scripts/installation/eggs
bin-directory = /home/centos/installation-scripts/installation/bin
dependent-scripts = true
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
eggs = %(__buildout_space_n__)sansible == 2.0.0
    boto
eggs-directory = /home/centos/installation-scripts/installation/eggs
recipe = zc.recipe.egg
scripts = ansible ansible-playbook
[dev-tools]
_b = /home/centos/installation-scripts/installation/bin
_d = /home/centos/installation-scripts/installation/develop-eggs
_e = /home/centos/installation-scripts/installation/eggs
bin-directory = /home/centos/installation-scripts/installation/bin
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
eggs = ipython
    ipdb
eggs-directory = /home/centos/installation-scripts/installation/eggs
extra-paths = /home/centos/installation-scripts/installation/parts/omelette
    /home/centos/installation-scripts/installation/eggs/zc.buildout-2.4.4-py2.7.egg
    /home/centos/installation-scripts/installation/develop-recipes
    /home/centos/installation-scripts/installation/src/doxee.ansible-tools
    /home/centos/installation-scripts/installation/src/biodec.troposphere
    /home/centos/installation-scripts/installation/src/ansible
recipe = zc.recipe.egg
[doxee-ansible-tools]
_b = /home/centos/installation-scripts/installation/bin
_d = /home/centos/installation-scripts/installation/develop-eggs
_e = /home/centos/installation-scripts/installation/eggs
bin-directory = /home/centos/installation-scripts/installation/bin
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
eggs = doxee.ansible-tools
eggs-directory = /home/centos/installation-scripts/installation/eggs
interpreter = python-test
recipe = zc.recipe.egg
[omelette]
_b = /home/centos/installation-scripts/installation/bin
_d = /home/centos/installation-scripts/installation/develop-eggs
_e = /home/centos/installation-scripts/installation/eggs
bin-directory = /home/centos/installation-scripts/installation/bin
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
eggs = doxee.ansible-tools
    ipython
    ipdb
eggs-directory = /home/centos/installation-scripts/installation/eggs
location = /home/centos/installation-scripts/installation/parts/omelette
recipe = collective.recipe.omelette
[python]
_b = /home/centos/installation-scripts/installation/bin
_d = /home/centos/installation-scripts/installation/develop-eggs
_e = /home/centos/installation-scripts/installation/eggs
bin-directory = /home/centos/installation-scripts/installation/bin
develop-eggs-directory = /home/centos/installation-scripts/installation/develop-eggs
eggs = boto
eggs-directory = /home/centos/installation-scripts/installation/eggs
interpreter = python
recipe = zc.recipe.egg:scripts
[roles]
create-intermediate = True
paths = /home/centos/installation-scripts/installation/parts/roles
recipe = z3c.recipe.mkdir
remove-on-update = False
[sources]
ansible = git https://github.com/ansible/ansible.git rev=v2.0.0-0.3.beta1
biodec.troposphere = git https://github.com/albeus/troposphere.git rev=1.1.1.post1
doxee.ansible-tools = git https://fang.hogwarts.local/doxee-platform/doxee.ansible-tools.git
[src]
create-intermediate = True
paths = /home/centos/installation-scripts/installation/parts/src
recipe = z3c.recipe.mkdir
remove-on-update = False
[templates]
_actions = [('ansible.cfg.in', 1444317724.2892032, 33204)]
_paths = 
recipe = z3c.recipe.filetemplate
relative-paths = false
source-directory = templates/base
[versions]
Jinja2 = 2.7.3
MarkupSafe = 0.23
PyYAML = 3.11
awscli = 1.7.35
boto = 2.38.0
collective.recipe.omelette = 0.16
colorama = 0.3.3
docutils = 0.12
ecdsa = 0.13
git-recipe = 0.2.2
ipdb = 0.8.1
ipython = 3.2.1
mr.developer = 1.31
netaddr = 0.7.15
paramiko = 1.15.2
pyaml = 15.6.3
pyasn1 = 0.1.8
pycrypto = 2.6.1
python-dateutil = 2.4.2
rsa = 3.1.4
setuptools = 16.0
six = 1.9.0
troposphere = 1.1.1.post1
z3c.recipe.filetemplate = 2.2.0
z3c.recipe.mkdir = 0.6
zc.buildout = 2.4.4
zc.recipe.egg = 2.0.1

Updating _mr.developer.
Installing 'mr.developer'.
We have the distribution that satisfies 'mr.developer==1.31'.
Getting required 'zc.buildout==2.4.4'
We have the distribution that satisfies 'zc.buildout==2.4.4'.
Getting required 'setuptools==16.0'
We have the distribution that satisfies 'setuptools==16.0'.
Adding find link 'https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790' from setuptools 16.0
Adding find link 'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2' from setuptools 16.0
Updating roles.
roles: set permissions for /home/centos/installation-scripts/installation/parts/roles
Updating src.
src: set permissions for /home/centos/installation-scripts/installation/parts/src
Updating templates.
Updating python.
Installing 'boto'.
We have the distribution that satisfies 'boto==2.38.0'.
Updating aws-cli.
Updating doxee-ansible-tools.
Installing 'doxee.ansible-tools'.
We have a develop egg: doxee.ansible-tools 1.0
Getting required 'troposphere==1.1.1.post1'
We have a develop egg: troposphere 1.1.1.post1
Getting required 'pyaml==15.6.3'
We have the distribution that satisfies 'pyaml==15.6.3'.
Getting required 'netaddr==0.7.15'
We have the distribution that satisfies 'netaddr==0.7.15'.
Getting required 'PyYAML==3.11'
We have the distribution that satisfies 'PyYAML==3.11'.
Updating omelette.
Installing 'doxee.ansible-tools', 'ipython', 'ipdb'.
We have a develop egg: doxee.ansible-tools 1.0
We have the distribution that satisfies 'ipython==3.2.1'.
We have the distribution that satisfies 'ipdb==0.8.1'.
Getting required 'troposphere==1.1.1.post1'
We have a develop egg: troposphere 1.1.1.post1
Getting required 'pyaml==15.6.3'
We have the distribution that satisfies 'pyaml==15.6.3'.
Getting required 'netaddr==0.7.15'
We have the distribution that satisfies 'netaddr==0.7.15'.
Getting required 'PyYAML==3.11'
We have the distribution that satisfies 'PyYAML==3.11'.
omelette: Warning: (While processing egg PyYAML) Package '_yaml' not found.  Skipping.
Updating dev-tools.
Installing 'ipython', 'ipdb'.
We have the distribution that satisfies 'ipython==3.2.1'.
We have the distribution that satisfies 'ipdb==0.8.1'.
Updating console_scripts.
Installing 'ansible == 2.0.0', 'boto'.
We have a develop egg: ansible 2.0.0
We have the distribution that satisfies 'boto==2.38.0'.
Getting required 'six==1.9.0'
We have the distribution that satisfies 'six==1.9.0'.
Getting required 'pycrypto==2.6.1'
We have the distribution that satisfies 'pycrypto==2.6.1'.
Getting required 'setuptools==16.0'
We have the distribution that satisfies 'setuptools==16.0'.
Adding find link 'https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790' from setuptools 16.0
Adding find link 'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2' from setuptools 16.0
Getting required 'PyYAML==3.11'
We have the distribution that satisfies 'PyYAML==3.11'.
Getting required 'jinja2==2.7.3'
We have the distribution that satisfies 'jinja2==2.7.3'.
Getting required 'paramiko==1.15.2'
We have the distribution that satisfies 'paramiko==1.15.2'.
Getting required 'markupsafe==0.23'
We have the distribution that satisfies 'markupsafe==0.23'.
Getting required 'ecdsa==0.13'
We have the distribution that satisfies 'ecdsa==0.13'.

what happens if you pin ansible to 1.9.x?

I had problems before installing ansible v1.7.x via buildout.
see ansible/ansible#1840

some time later installing ansible 1.9 went fine,
but I didn't investigate if they fixed it properly or not.
maybe 2.0 contains a regression

Contributor

reinout commented Oct 14, 2015

@visik7: What's in your base.cfg? The most relevant part is in there as I see mr.developer: Queued 'ansible' for checkout. and there's no mr.developer in the buildout.cfg.

Which ansible version are you using? I know it sounds like a workaround, but "just" installing ansible works fine. You're having problems because you're installing a checked out version (because buildout apparently doesn't support that). Using the latest regular release ought to work. I mean, I have it working in two separate projects on my harddisk right now :-)

visik7 commented Oct 14, 2015

yes ansible 1.9.4 works fine but it's from pypi
I need devel branch
here my base.cfg

[buildout]
parts =
    roles
    src
    templates
    python

extends = 
    versions/development.cfg

update-versions-file = versions/last-versions.cfg
versions =
    versions


[src]
recipe = z3c.recipe.mkdir

[roles]
recipe = z3c.recipe.mkdir

[templates]
recipe = z3c.recipe.filetemplate
source-directory = templates/base

[python]
recipe = zc.recipe.egg:scripts
interpreter = python
eggs = boto

in the buildout.cfg there is

extensions = mr.developer

@WouterVH I'll try with a tag of 1.9

Contributor

reinout commented Oct 14, 2015

@WouterVH: I suspect ansible master is fine. There is indeed something in buildout's distutils-script detection that's not complete. The detection (that I originally wrote to get pyflakes to install) works fine for installed eggs, but not for development eggs and mr.developer checkouts.

Contributor

reinout commented Oct 14, 2015

I've done some more digging. There are two causes:

  • python setup.py egg_info and python setup.py develop do not generate the your_package.egg-info/scripts/* directory. So buildout cannot figure out that there are scripts by looking at the metadata. This does work for eggs installed with python setup.py install.
  • Buildout calls python setup.py develop with the -x option, which means Don't install scripts. Which isn't as weird as it sounds, actually. When you leave out -x, the script is installed in some temp dir and buildout would have to copy it over. But that would go around the regular script installation code. And the script installation code can just as well install the scripts itself because it can look at the metadata.

Only: the metadata on distutils scripts isn't complete! Sound like I'll have to work/hack around that.

Contributor

reinout commented Oct 14, 2015

I've got it working locally! Which means: I've hacked around in my installed zc.buildout 2.4.4 egg. I'll make a branch to reproduce the problem in a test and then I'll clean up my fix.

visik7 commented Oct 14, 2015

I'm holding my breath :) I'm stucked since 3 days on this issue

Contributor

reinout commented Oct 14, 2015

@visik7: could you try copying https://raw.githubusercontent.com/buildout/buildout/reinout-develop-distutils-scripts/src/zc/buildout/easy_install.py over the easy_install.py from the buildout egg you're using now? Probably something looking like /Users/reinout/.buildout/eggs/zc.buildout-2.4.4-py2.7.egg/zc/buildout/easy_install.py (look in the file bin/buildout for the exact path if needed).

Contributor

reinout commented Oct 14, 2015

@specialunderwear: thanks for making that 'tompoes' test repository. That really helped debugging the issue!

visik7 commented Oct 14, 2015

IT WORKS MAN !!!!!

Installing 'mr.developer'.
We have the distribution that satisfies 'mr.developer==1.31'.
mr.developer: Queued 'ansible' for checkout.
mr.developer: Queued 'biodec.troposphere' for checkout.
mr.developer: Queued 'doxee.ansible-tools' for checkout.
mr.developer: Skipped checkout of existing package 'ansible'.
mr.developer: Skipped checkout of existing package 'biodec.troposphere'.
mr.developer: Skipped checkout of existing package 'doxee.ansible-tools'.
Installing 'zc.buildout', 'setuptools'.
We have the distribution that satisfies 'zc.buildout==2.4.4'.
We have the distribution that satisfies 'setuptools==16.0'.
Adding find link 'https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790' from setuptools 16.0
Adding find link 'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2' from setuptools 16.0
Develop: '/home/centos/installation-scripts/installation/develop-recipes'
Develop: '/home/centos/installation-scripts/installation/src/doxee.ansible-tools'
Develop: '/home/centos/installation-scripts/installation/src/biodec.troposphere'
warning: no files found matching 'README.md'
Distutils scripts found for develop egg troposphere: [['cfn', '#!/usr/bin/env python\n\nimport argparse\nimport sys\nimport time\nfrom ast import literal_eval\n\ntry:\n    import boto\n    import boto.cloudformation\nexcept ImportError:\n    print("boto 2.8.0+ is required")\n    sys.exit(1)\n\ndef upload_template_to_s3(conn, region, bucket_name, key_name, template):\n    cloudformation_bucket = conn.lookup(bucket_name)\n    if not cloudformation_bucket:\n        cloudformation_bucket = conn.create_bucket(bucket_name, location=region)\n    key = cloudformation_bucket.new_key(key_name)\n    key.set_contents_from_string(template)\n    cfn_template_url = "https://s3.amazonaws.com/%s/%s" % (\n        bucket_name, key_name)\n    return cfn_template_url\n\n\ndef create_stack(conn, stackname, template=None, url=None, params=None):\n    try:\n        if url:\n            stack_id = conn.create_stack(\n                stackname, template_url=url, parameters=params)\n        else:\n            stack_id = conn.create_stack(\n                stackname, template, parameters=params)\n    except boto.exception.BotoServerError as e:\n        # XXX - need to figure out why this isn\'t getting parsed from boto.\n        print("Error: %s" %\n              (literal_eval(e.error_message)[\'Error\'][\'Message\'],))\n        print("Exiting...")\n        sys.exit(1)\n    print("Created stack %s: %s" % (stackname, stack_id))\n\n\ndef build_s3_name(stack_name):\n    timestamp = time.strftime(\'%Y-%m-%dT%H:%M:%SZ\', time.gmtime())\n    name = stack_name\n    if stack_name.endswith(\'.json\'):\n        name = stack_name[:-5]\n    return \'%s-%s.json\' % (name, timestamp)\n\n\ndef describe_resources(conn, stackname):\n    if stackname is not None:\n        print(conn.describe_stack_resources(stackname))\n    else:\n        stacks = conn.describe_stacks()\n        for stack in stacks:\n            print("Resources for stack {0}:".format(stack.stack_name))\n            print(conn.describe_stack_resources(stack.stack_name))\n\n\ndef get_events(conn, stackname):\n    """Get the events in batches and return in chronological order"""\n    next = None\n    event_list = []\n    while 1:\n        events = conn.describe_stack_events(stackname, next)\n        event_list.append(events)\n        if events.next_token is None:\n            break\n        next = events.next_token\n        time.sleep(1)\n    return reversed(sum(event_list, []))\n\n\ndef tail(conn, stack_name):\n    """Show and then tail the event log"""\n    def tail_print(e):\n        print("%s %s %s" % (e.resource_status, e.resource_type, e.event_id))\n\n    # First dump the full list of events in chronological order and keep\n    # track of the events we\'ve seen already\n    seen = set()\n    initial_events = get_events(conn, stack_name)\n    for e in initial_events:\n        tail_print(e)\n        seen.add(e.event_id)\n\n    # Now keep looping through and dump the new events\n    while 1:\n        events = get_events(conn, stack_name)\n        for e in events:\n            if e.event_id not in seen:\n                tail_print(e)\n            seen.add(e.event_id)\n        time.sleep(5)\n\n\nif __name__ == "__main__":\n    parser = argparse.ArgumentParser()\n    parser.add_argument("-c", "--create", help="Create stack using template")\n    parser.add_argument("-b", "--bucket", dest="s3bucket",\n                        help="Upload template to S3 bucket")\n    parser.add_argument("-d", "--debug", action=\'store_true\',\n                        help="Turn on boto debug logging")\n    parser.add_argument("-n", "--name", dest="s3name",\n                        help="Template name in S3 bucket")\n    parser.add_argument("-p", "--parameter", dest="params", action=\'append\',\n                        help="stack parameters in key=value form")\n    parser.add_argument("-r", "--region", default="us-east-1",\n                        help="Region (default %(default)s)")\n    parser.add_argument("-R", "--resources", action=\'store_true\',\n                        help="describe stack resources, list resources for "\n                             "all stacks if no stack is specified")\n    parser.add_argument("-t", "--tail", action=\'store_true\',\n                        help="tail event log")\n    parser.add_argument("stack", nargs=\'?\')\n    values = parser.parse_args()\n\n    if values.params:\n        values.params = [x.split(\'=\') for x in values.params]\n    else:\n        values.params = []\n\n    if values.debug:\n        import logging\n        logging.basicConfig(filename="boto.log", level=logging.DEBUG)\n\n    conn = boto.cloudformation.connect_to_region(values.region)\n\n    if values.create:\n        # Read in the template file\n        template = open(values.create).read()\n\n        # If needed, build an S3 name (key)\n        if values.s3bucket and not values.s3name:\n            values.s3name = build_s3_name(values.create)\n\n        if values.s3bucket:\n            # Upload to S3 and create the stack\n            s3conn = boto.s3.connect_to_region(values.region)\n            url = upload_template_to_s3(\n                s3conn, values.region, values.s3bucket, values.s3name, template)\n            create_stack(conn, values.stack, None, url, values.params)\n        else:\n            # Upload file as part of the stack creation\n            create_stack(conn, values.stack, template, None, values.params)\n\n    if values.resources:\n        describe_resources(conn, values.stack)\n\n    if values.tail:\n        tail(conn, values.stack)\n'], ['cfn2py', '#!/usr/bin/env python\n\n\nimport argparse\nimport json\nimport pprint\n\n\nclass object_registry(object):\n    """Keep track of objects being created as Parameters or Resources\n    in order to map back to due to use in intrinsic functions like\n    Ref() and GetAtt().\n    """\n    def __init__(self):\n        self.objects = {}\n\n    def add(self, o):\n        new_name = o.replace(\'-\', \'_\')\n        self.objects[o] = new_name\n        return new_name\n\n    def lookup(self, o):\n        if o in self.objects:\n            return self.objects[o]\n        else:\n            return output_value(o)\n\nobjects = object_registry()\n\nobject_functions = {\n    "Table":        [ "ProvisionedThroughput", "PrimaryKey", "Element" ],\n    "LoadBalancer": [ "HealthCheck", "ConnectionDrainingPolicy", "AccessLoggingPolicy" ],\n    "Queue":        [ "RedrivePolicy" ],\n    "Bucket":       [ "WebsiteConfiguration" ],\n    "User":         [ "LoginProfile" ],\n    "Topic":        [ "Subscription" ],\n    "Instance":     [ "NetworkInterfaceProperty", "PrivateIpAddressSpecification" ],\n    "RecordSet":    [ "RecordSetType" ],\n    "Policy":       [ "PolicyType" ],\n}\n\ndef additional_imports(o):\n    if object_functions.has_key(o):\n        return ", ".join([o] + object_functions[o])\n    else:\n        return o\n\ndef do_header(d):\n    """Output a stock header for the new Python script and also try to\n    figure out the Resource imports needed by the template.\n    """\n    print \'from troposphere import Base64, Select, FindInMap, GetAtt, GetAZs, Join, Output\'\n    print \'from troposphere import Parameter, Ref, Tags, Template\'\n    print \'from troposphere.cloudformation import Init\'\n    print \'from troposphere.cloudfront import Distribution, DistributionConfig\'\n    print \'from troposphere.cloudfront import Origin, DefaultCacheBehavior\'\n    print \'from troposphere.ec2 import PortRange\'\n\n    # Loop over the resources to find imports\n    if \'Resources\' in d:\n        seen = []\n        resources = d[\'Resources\']\n        for k, v in resources.items():\n            (mod, tropo_object) = generate_troposphere_object(v[\'Type\'])\n            if tropo_object not in seen:\n                seen.append(tropo_object)\n                print \'from troposphere.%s import %s\' % (mod, additional_imports(tropo_object))\n    print\n    print\n    print "t = Template()"\n    print\n\n\ndef do_awstemplateformatversion(d):\n    """Output the template version"""\n    print \'t.add_version("%s")\' % (d[\'AWSTemplateFormatVersion\'], )\n    print\n\n\ndef do_description(d):\n    """Output the template Description"""\n    print \'t.add_description("""\\\\\\n%s""")\' % (d[\'Description\'], )\n\n\ndef do_parameters(d):\n    """Output the template Parameters"""\n    params = d[\'Parameters\']\n    for k, v in params.items():\n        object_name = objects.add(k)\n        print \'%s = t.add_parameter(Parameter(\' % (object_name,)\n        print \'    "%s",\' % (k, )\n        for pk, pv in v.items():\n            print \'    %s=%s,\' % (pk, output_value(pv))\n        print "))"\n        print\n\n\ndef do_mappings(d):\n    """Output the template Mappings"""\n    mappings = d[\'Mappings\']\n    for k, v in mappings.items():\n        print \'t.add_mapping("%s",\' % (k,)\n        pprint.pprint(v)\n        print ")"\n        print\n\n\ndef generate_troposphere_object(typename):\n    """Try to determine the troposphere object to create from the Type\n    specification from the Resource being converted.\n    """\n    t = typename.split(\':\')\n    if len(t) == 5:\n        return (t[2].lower(), t[4])\n    else:\n        return (\'\', typename)\n\n\ndef output_dict(d):\n    out = []\n    for k,v in d.items():\n        out.append("%s=%s" % (k.replace(\'\\\\\', \'\\\\\\\\\'), output_value(v)))\n    return ", ".join(out)\n\nknown_functions = {\n    "DistributionConfig":       1,\n    "DefaultCacheBehavior":     1,\n    "ProvisionedThroughput":    1,\n    "NetworkInterfaces":        1,\n    "WebsiteConfiguration":     1,\n    "RedrivePolicy":            1,\n    "Subscription":             1,\n    "KeySchema":                1,\n    "HashKeyElement":           1,\n    "HealthCheck":              1,\n    "LoginProfile":             1,\n    "ConnectionDrainingPolicy": 1,\n    "AccessLoggingPolicy":      1,\n    "AWS::CloudFormation::Init":1,\n    "PrivateIpAddresses"       :1,\n}\n\nfunction_quirks = {\n    "KeySchema":          "PrimaryKey",\n    "HashKeyElement":     { "Element": ["AttributeName", "AttributeType"] },\n    "NetworkInterfaces":  [ "NetworkInterfaceProperty" ],\n    "Subscription":       [ "Subscription" ],\n    "LoginProfile":       { "LoginProfile": ["Password"] },\n    "AWS::CloudFormation::Init": {"Init": []},\n    "PrivateIpAddresses" : ["PrivateIpAddressSpecification"],\n}\n\ndef do_output_function(k, f, v):\n    print \'    %s=%s(\' % (k, f)\n    for pk, pv in v.items():\n        if known_functions.has_key(pk):\n            do_resources_content(pk, pv, "")\n        else:\n            print "        %s=%s," % (pk, output_value(pv))\n    print \'    ),\'\n\ndef do_output_quirk_list(k, f, v):\n    print \'    %s=[\' % (k)\n    for e in v:\n        print \'    %s(\' % (f)\n        for pk, pv in e.items():\n            if known_functions.has_key(pk):\n                do_resources_content(pk, pv)\n            else:\n                print "        %s=%s," % (pk, output_value(pv))\n        print \'    ),\'\n    print \'    ],\'\n\ndef do_output_quirk_mapping(k, v):\n    m = function_quirks[k]\n    for pk in m.keys():\n        print \'    %s=%s(\' % (k, pk)\n        for e in m[pk]:\n            print "        %s," % (output_value(v[e]))\n        print \'    ),\'\n\ndef do_output_quirk_metadata(k, v):\n    m = function_quirks[k]\n    for pk in m.keys():\n        print \'    Metadata=%s(\' % (pk)\n        print "        %s," % (output_value(v))\n        print \'    ),\'\n\ndef do_resources_content(k, v, p=""):\n    if function_quirks.has_key(k):\n        x = function_quirks[k];\n        if(isinstance(x, dict)):\n            if(p == "Metadata"):\n                do_output_quirk_metadata(k, v)\n            else:\n                do_output_quirk_mapping(k, v)\n        elif(isinstance(x, list)):\n           do_output_quirk_list(k, x[0], v)\n        else:\n           do_output_function(k, x, v)\n    else:\n        do_output_function(k, k, v)\n\ntop_level_aliases = {\n    "RecordSet": "RecordSetType",\n    "Policy":    "PolicyType",\n}\n\ndef do_resources(d):\n    """Output the template Resources"""\n    resources = d[\'Resources\']\n    for k, v in resources.items():\n        object_name = objects.add(k)\n        (_, tropo_object) = generate_troposphere_object(v[\'Type\'])\n        if(top_level_aliases.has_key(tropo_object)):\n            tropo_object = top_level_aliases[tropo_object]\n        print \'%s = t.add_resource(%s(\' % (object_name, tropo_object)\n        print \'    "%s",\' % (k, )\n        for p in filter(lambda x: v.has_key(x), [\'Metadata\', \'Properties\']):\n            for pk, pv in v[p].items():\n                if pk == "Tags":\n                    print \'    Tags=Tags(\'\n                    for d in pv:\n                        print "        %s=%s," % (\n                            d[\'Key\'], output_value(d[\'Value\']))\n                    print \'    ),\'\n                elif pk == \'PortRange\':\n                    print "    %s=%s(%s)," % (pk, pk, output_dict(pv))\n                elif known_functions.has_key(pk):\n                    do_resources_content(pk, pv, p)\n                elif isinstance(pv, basestring):\n                    print \'    %s="%s",\' % (pk, pv)\n                else:\n                    print \'    %s=%s,\' % (pk, output_value(pv))\n        if v.has_key("DependsOn"):\n            print \'    %s=%s,\' % ("DependsOn", output_value(v[\'DependsOn\']))\n        print "))"\n        print\n\n\ndef handle_no_objects(name, values):\n    """Handle intrinsic functions which do not have a named resource"""\n    return name + "(" + ", ".join(map(output_value, values)) + ")"\n\ndef handle_one_object(name, values):\n    """Handle intrinsic functions which have a single named resource"""\n    ret = name + "("\n    for i, param in enumerate(values):\n        if i > 0:\n            ret += ", "\n        # First parameter might be an object name or pseudo parameter\n        if i == 0:\n            ret += objects.lookup(param)\n        else:\n            ret += output_value(param)\n    return ret + ")"\n\n\nfunction_map = {\n    \'Fn::Base64\': ("Base64", handle_no_objects),\n    \'Fn::FindInMap\': ("FindInMap", handle_no_objects),\n    \'Fn::GetAtt\': ("GetAtt", handle_one_object),\n    \'Fn::GetAZs\': ("GetAZs", handle_no_objects),\n    \'Fn::Join\': ("Join", handle_no_objects),\n    \'Fn::Select\': ("Select", handle_one_object),\n    \'Ref\': ("Ref", handle_one_object),\n}\n\n\ndef output_value(v):\n    """Output a value which may be a string or a set of function calls."""\n    if isinstance(v, basestring):\n        return \'"%s"\' % (v.replace(\'\\\\\', \'\\\\\\\\\').replace(\'\\n\', \'\\\\n\').replace("\\"", "\\\\\\""))\n    elif isinstance(v, bool):\n        return \'%s\' % (str(v))\n    elif isinstance(v, int):\n        return \'%d\' % (v)\n    elif isinstance(v, list):\n        return "[" + ", ".join(map(output_value, v)) + "]"\n\n    out = []\n    # Should only be one of these...\n    for fk, fv in v.items():\n        if fk in function_map:\n            (shortname, handler) = function_map[fk]\n            if not isinstance(fv, list):\n                fv = [fv]\n            return handler(shortname, fv)\n        else:\n            out.append( \'"\' + fk + \'": \' + output_value(fv))\n    return "{ " + ", ".join(out) + " }"\n\n\ndef do_outputs(d):\n    """Output the template Outputs"""\n    outputs = d[\'Outputs\']\n    for k, v in outputs.items():\n        print \'%s = t.add_output(Output(\' % (k,)\n        print \'    "%s",\' % (k, )\n        for pk, pv in v.items():\n            if isinstance(pv, basestring):\n                print \'    %s="%s",\' % (pk, pv)\n            else:\n                print \'    %s=%s,\' % (pk, output_value(pv))\n        print "))"\n        print\n\n\ndef do_trailer(d):\n    """Output a trailer section for the new Python script."""\n    print \'print(t.to_json())\'\n\n\nif __name__ == "__main__":\n    parser = argparse.ArgumentParser()\n    parser.add_argument("filename", help="template to convert")\n    args = parser.parse_args()\n\n    d = json.load(open(args.filename))\n\n    do_header(d)\n\n    sections = [\n        \'AWSTemplateFormatVersion\',\n        \'Description\',\n        \'Parameters\',\n        \'Mappings\',\n        \'Resources\',\n        \'Outputs\',\n    ]\n\n    for s in sections:\n        if s in d.keys():\n            globals()["do_" + s.lower()](d)\n\n    do_trailer(d)\n']]
Develop: '/home/centos/installation-scripts/installation/src/ansible'
no previously-included directories found matching 'v2'
no previously-included directories found matching 'docsite'
no previously-included directories found matching 'ticket_stubs'
no previously-included directories found matching 'test'
no previously-included directories found matching 'hacking'
no previously-included directories found matching 'lib/ansible/modules/core/.git'
no previously-included directories found matching 'lib/ansible/modules/extras/.git'
Distutils scripts found for develop egg ansible: [['ansible', '#!/usr/bin/env python\n\n# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>\n#\n# This file is part of Ansible\n#\n# Ansible is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Ansible is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n\n########################################################\nfrom __future__ import (absolute_import, print_function)\n__metaclass__ = type\n\n__requires__ = [\'ansible\']\ntry:\n    import pkg_resources\nexcept Exception:\n    # Use pkg_resources to find the correct versions of libraries and set\n    # sys.path appropriately when there are multiversion installs.  But we\n    # have code that better expresses the errors in the places where the code\n    # is actually used (the deps are optional for many code paths) so we don\'t\n    # want to fail here.\n    pass\n\nimport os\nimport sys\nimport traceback\n\nfrom ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError\nfrom ansible.utils.display import Display\n\n########################################\n### OUTPUT OF LAST RESORT ###\nclass LastResort(object):\n    def display(self, msg):\n        print(msg, file=sys.stderr)\n\n    def error(self, msg, wrap_text=None):\n        print(msg, file=sys.stderr)\n\n\n########################################\n\nif __name__ == \'__main__\':\n\n    display = LastResort()\n    cli = None\n    me = os.path.basename(sys.argv[0])\n\n    try:\n        display = Display()\n\n        if me == \'ansible-playbook\':\n            from ansible.cli.playbook import PlaybookCLI as mycli\n        elif me == \'ansible\':\n            from ansible.cli.adhoc import AdHocCLI as mycli\n        elif me == \'ansible-pull\':\n            from ansible.cli.pull import PullCLI as mycli\n        elif me == \'ansible-doc\':\n            from ansible.cli.doc import DocCLI as mycli\n        elif me == \'ansible-vault\':\n            from ansible.cli.vault import VaultCLI as mycli\n        elif me == \'ansible-galaxy\':\n            from ansible.cli.galaxy import GalaxyCLI as mycli\n\n        cli = mycli(sys.argv, display=display)\n        if cli:\n            cli.parse()\n            sys.exit(cli.run())\n        else:\n            raise AnsibleError("Program not implemented: %s" % me)\n\n    except AnsibleOptionsError as e:\n        cli.parser.print_help()\n        display.error(str(e), wrap_text=False)\n        sys.exit(5)\n    except AnsibleParserError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(4)\n# TQM takes care of these, but leaving comment to reserve the exit codes\n#    except AnsibleHostUnreachable as e:\n#        display.error(str(e))\n#        sys.exit(3)\n#    except AnsibleHostFailed as e:\n#        display.error(str(e))\n#        sys.exit(2)\n    except AnsibleError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(1)\n    except KeyboardInterrupt:\n        display.error("User interrupted execution")\n        sys.exit(99)\n    except Exception as e:\n        have_cli_options = cli is not None and cli.options is not None\n        display.error("Unexpected Exception: %s" % str(e), wrap_text=False)\n        if not have_cli_options or have_cli_options and cli.options.verbosity > 2:\n            display.display("the full traceback was:\\n\\n%s" % traceback.format_exc())\n        else:\n            display.display("to see the full traceback, use -vvv")\n        sys.exit(250)\n'], ['ansible-playbook', '#!/usr/bin/env python\n\n# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>\n#\n# This file is part of Ansible\n#\n# Ansible is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Ansible is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n\n########################################################\nfrom __future__ import (absolute_import, print_function)\n__metaclass__ = type\n\n__requires__ = [\'ansible\']\ntry:\n    import pkg_resources\nexcept Exception:\n    # Use pkg_resources to find the correct versions of libraries and set\n    # sys.path appropriately when there are multiversion installs.  But we\n    # have code that better expresses the errors in the places where the code\n    # is actually used (the deps are optional for many code paths) so we don\'t\n    # want to fail here.\n    pass\n\nimport os\nimport sys\nimport traceback\n\nfrom ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError\nfrom ansible.utils.display import Display\n\n########################################\n### OUTPUT OF LAST RESORT ###\nclass LastResort(object):\n    def display(self, msg):\n        print(msg, file=sys.stderr)\n\n    def error(self, msg, wrap_text=None):\n        print(msg, file=sys.stderr)\n\n\n########################################\n\nif __name__ == \'__main__\':\n\n    display = LastResort()\n    cli = None\n    me = os.path.basename(sys.argv[0])\n\n    try:\n        display = Display()\n\n        if me == \'ansible-playbook\':\n            from ansible.cli.playbook import PlaybookCLI as mycli\n        elif me == \'ansible\':\n            from ansible.cli.adhoc import AdHocCLI as mycli\n        elif me == \'ansible-pull\':\n            from ansible.cli.pull import PullCLI as mycli\n        elif me == \'ansible-doc\':\n            from ansible.cli.doc import DocCLI as mycli\n        elif me == \'ansible-vault\':\n            from ansible.cli.vault import VaultCLI as mycli\n        elif me == \'ansible-galaxy\':\n            from ansible.cli.galaxy import GalaxyCLI as mycli\n\n        cli = mycli(sys.argv, display=display)\n        if cli:\n            cli.parse()\n            sys.exit(cli.run())\n        else:\n            raise AnsibleError("Program not implemented: %s" % me)\n\n    except AnsibleOptionsError as e:\n        cli.parser.print_help()\n        display.error(str(e), wrap_text=False)\n        sys.exit(5)\n    except AnsibleParserError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(4)\n# TQM takes care of these, but leaving comment to reserve the exit codes\n#    except AnsibleHostUnreachable as e:\n#        display.error(str(e))\n#        sys.exit(3)\n#    except AnsibleHostFailed as e:\n#        display.error(str(e))\n#        sys.exit(2)\n    except AnsibleError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(1)\n    except KeyboardInterrupt:\n        display.error("User interrupted execution")\n        sys.exit(99)\n    except Exception as e:\n        have_cli_options = cli is not None and cli.options is not None\n        display.error("Unexpected Exception: %s" % str(e), wrap_text=False)\n        if not have_cli_options or have_cli_options and cli.options.verbosity > 2:\n            display.display("the full traceback was:\\n\\n%s" % traceback.format_exc())\n        else:\n            display.display("to see the full traceback, use -vvv")\n        sys.exit(250)\n'], ['ansible-pull', '#!/usr/bin/env python\n\n# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>\n#\n# This file is part of Ansible\n#\n# Ansible is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Ansible is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n\n########################################################\nfrom __future__ import (absolute_import, print_function)\n__metaclass__ = type\n\n__requires__ = [\'ansible\']\ntry:\n    import pkg_resources\nexcept Exception:\n    # Use pkg_resources to find the correct versions of libraries and set\n    # sys.path appropriately when there are multiversion installs.  But we\n    # have code that better expresses the errors in the places where the code\n    # is actually used (the deps are optional for many code paths) so we don\'t\n    # want to fail here.\n    pass\n\nimport os\nimport sys\nimport traceback\n\nfrom ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError\nfrom ansible.utils.display import Display\n\n########################################\n### OUTPUT OF LAST RESORT ###\nclass LastResort(object):\n    def display(self, msg):\n        print(msg, file=sys.stderr)\n\n    def error(self, msg, wrap_text=None):\n        print(msg, file=sys.stderr)\n\n\n########################################\n\nif __name__ == \'__main__\':\n\n    display = LastResort()\n    cli = None\n    me = os.path.basename(sys.argv[0])\n\n    try:\n        display = Display()\n\n        if me == \'ansible-playbook\':\n            from ansible.cli.playbook import PlaybookCLI as mycli\n        elif me == \'ansible\':\n            from ansible.cli.adhoc import AdHocCLI as mycli\n        elif me == \'ansible-pull\':\n            from ansible.cli.pull import PullCLI as mycli\n        elif me == \'ansible-doc\':\n            from ansible.cli.doc import DocCLI as mycli\n        elif me == \'ansible-vault\':\n            from ansible.cli.vault import VaultCLI as mycli\n        elif me == \'ansible-galaxy\':\n            from ansible.cli.galaxy import GalaxyCLI as mycli\n\n        cli = mycli(sys.argv, display=display)\n        if cli:\n            cli.parse()\n            sys.exit(cli.run())\n        else:\n            raise AnsibleError("Program not implemented: %s" % me)\n\n    except AnsibleOptionsError as e:\n        cli.parser.print_help()\n        display.error(str(e), wrap_text=False)\n        sys.exit(5)\n    except AnsibleParserError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(4)\n# TQM takes care of these, but leaving comment to reserve the exit codes\n#    except AnsibleHostUnreachable as e:\n#        display.error(str(e))\n#        sys.exit(3)\n#    except AnsibleHostFailed as e:\n#        display.error(str(e))\n#        sys.exit(2)\n    except AnsibleError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(1)\n    except KeyboardInterrupt:\n        display.error("User interrupted execution")\n        sys.exit(99)\n    except Exception as e:\n        have_cli_options = cli is not None and cli.options is not None\n        display.error("Unexpected Exception: %s" % str(e), wrap_text=False)\n        if not have_cli_options or have_cli_options and cli.options.verbosity > 2:\n            display.display("the full traceback was:\\n\\n%s" % traceback.format_exc())\n        else:\n            display.display("to see the full traceback, use -vvv")\n        sys.exit(250)\n'], ['ansible-doc', '#!/usr/bin/env python\n\n# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>\n#\n# This file is part of Ansible\n#\n# Ansible is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Ansible is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n\n########################################################\nfrom __future__ import (absolute_import, print_function)\n__metaclass__ = type\n\n__requires__ = [\'ansible\']\ntry:\n    import pkg_resources\nexcept Exception:\n    # Use pkg_resources to find the correct versions of libraries and set\n    # sys.path appropriately when there are multiversion installs.  But we\n    # have code that better expresses the errors in the places where the code\n    # is actually used (the deps are optional for many code paths) so we don\'t\n    # want to fail here.\n    pass\n\nimport os\nimport sys\nimport traceback\n\nfrom ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError\nfrom ansible.utils.display import Display\n\n########################################\n### OUTPUT OF LAST RESORT ###\nclass LastResort(object):\n    def display(self, msg):\n        print(msg, file=sys.stderr)\n\n    def error(self, msg, wrap_text=None):\n        print(msg, file=sys.stderr)\n\n\n########################################\n\nif __name__ == \'__main__\':\n\n    display = LastResort()\n    cli = None\n    me = os.path.basename(sys.argv[0])\n\n    try:\n        display = Display()\n\n        if me == \'ansible-playbook\':\n            from ansible.cli.playbook import PlaybookCLI as mycli\n        elif me == \'ansible\':\n            from ansible.cli.adhoc import AdHocCLI as mycli\n        elif me == \'ansible-pull\':\n            from ansible.cli.pull import PullCLI as mycli\n        elif me == \'ansible-doc\':\n            from ansible.cli.doc import DocCLI as mycli\n        elif me == \'ansible-vault\':\n            from ansible.cli.vault import VaultCLI as mycli\n        elif me == \'ansible-galaxy\':\n            from ansible.cli.galaxy import GalaxyCLI as mycli\n\n        cli = mycli(sys.argv, display=display)\n        if cli:\n            cli.parse()\n            sys.exit(cli.run())\n        else:\n            raise AnsibleError("Program not implemented: %s" % me)\n\n    except AnsibleOptionsError as e:\n        cli.parser.print_help()\n        display.error(str(e), wrap_text=False)\n        sys.exit(5)\n    except AnsibleParserError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(4)\n# TQM takes care of these, but leaving comment to reserve the exit codes\n#    except AnsibleHostUnreachable as e:\n#        display.error(str(e))\n#        sys.exit(3)\n#    except AnsibleHostFailed as e:\n#        display.error(str(e))\n#        sys.exit(2)\n    except AnsibleError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(1)\n    except KeyboardInterrupt:\n        display.error("User interrupted execution")\n        sys.exit(99)\n    except Exception as e:\n        have_cli_options = cli is not None and cli.options is not None\n        display.error("Unexpected Exception: %s" % str(e), wrap_text=False)\n        if not have_cli_options or have_cli_options and cli.options.verbosity > 2:\n            display.display("the full traceback was:\\n\\n%s" % traceback.format_exc())\n        else:\n            display.display("to see the full traceback, use -vvv")\n        sys.exit(250)\n'], ['ansible-galaxy', '#!/usr/bin/env python\n\n# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>\n#\n# This file is part of Ansible\n#\n# Ansible is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Ansible is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n\n########################################################\nfrom __future__ import (absolute_import, print_function)\n__metaclass__ = type\n\n__requires__ = [\'ansible\']\ntry:\n    import pkg_resources\nexcept Exception:\n    # Use pkg_resources to find the correct versions of libraries and set\n    # sys.path appropriately when there are multiversion installs.  But we\n    # have code that better expresses the errors in the places where the code\n    # is actually used (the deps are optional for many code paths) so we don\'t\n    # want to fail here.\n    pass\n\nimport os\nimport sys\nimport traceback\n\nfrom ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError\nfrom ansible.utils.display import Display\n\n########################################\n### OUTPUT OF LAST RESORT ###\nclass LastResort(object):\n    def display(self, msg):\n        print(msg, file=sys.stderr)\n\n    def error(self, msg, wrap_text=None):\n        print(msg, file=sys.stderr)\n\n\n########################################\n\nif __name__ == \'__main__\':\n\n    display = LastResort()\n    cli = None\n    me = os.path.basename(sys.argv[0])\n\n    try:\n        display = Display()\n\n        if me == \'ansible-playbook\':\n            from ansible.cli.playbook import PlaybookCLI as mycli\n        elif me == \'ansible\':\n            from ansible.cli.adhoc import AdHocCLI as mycli\n        elif me == \'ansible-pull\':\n            from ansible.cli.pull import PullCLI as mycli\n        elif me == \'ansible-doc\':\n            from ansible.cli.doc import DocCLI as mycli\n        elif me == \'ansible-vault\':\n            from ansible.cli.vault import VaultCLI as mycli\n        elif me == \'ansible-galaxy\':\n            from ansible.cli.galaxy import GalaxyCLI as mycli\n\n        cli = mycli(sys.argv, display=display)\n        if cli:\n            cli.parse()\n            sys.exit(cli.run())\n        else:\n            raise AnsibleError("Program not implemented: %s" % me)\n\n    except AnsibleOptionsError as e:\n        cli.parser.print_help()\n        display.error(str(e), wrap_text=False)\n        sys.exit(5)\n    except AnsibleParserError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(4)\n# TQM takes care of these, but leaving comment to reserve the exit codes\n#    except AnsibleHostUnreachable as e:\n#        display.error(str(e))\n#        sys.exit(3)\n#    except AnsibleHostFailed as e:\n#        display.error(str(e))\n#        sys.exit(2)\n    except AnsibleError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(1)\n    except KeyboardInterrupt:\n        display.error("User interrupted execution")\n        sys.exit(99)\n    except Exception as e:\n        have_cli_options = cli is not None and cli.options is not None\n        display.error("Unexpected Exception: %s" % str(e), wrap_text=False)\n        if not have_cli_options or have_cli_options and cli.options.verbosity > 2:\n            display.display("the full traceback was:\\n\\n%s" % traceback.format_exc())\n        else:\n            display.display("to see the full traceback, use -vvv")\n        sys.exit(250)\n'], ['ansible-vault', '#!/usr/bin/env python\n\n# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>\n#\n# This file is part of Ansible\n#\n# Ansible is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Ansible is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.\n\n########################################################\nfrom __future__ import (absolute_import, print_function)\n__metaclass__ = type\n\n__requires__ = [\'ansible\']\ntry:\n    import pkg_resources\nexcept Exception:\n    # Use pkg_resources to find the correct versions of libraries and set\n    # sys.path appropriately when there are multiversion installs.  But we\n    # have code that better expresses the errors in the places where the code\n    # is actually used (the deps are optional for many code paths) so we don\'t\n    # want to fail here.\n    pass\n\nimport os\nimport sys\nimport traceback\n\nfrom ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError\nfrom ansible.utils.display import Display\n\n########################################\n### OUTPUT OF LAST RESORT ###\nclass LastResort(object):\n    def display(self, msg):\n        print(msg, file=sys.stderr)\n\n    def error(self, msg, wrap_text=None):\n        print(msg, file=sys.stderr)\n\n\n########################################\n\nif __name__ == \'__main__\':\n\n    display = LastResort()\n    cli = None\n    me = os.path.basename(sys.argv[0])\n\n    try:\n        display = Display()\n\n        if me == \'ansible-playbook\':\n            from ansible.cli.playbook import PlaybookCLI as mycli\n        elif me == \'ansible\':\n            from ansible.cli.adhoc import AdHocCLI as mycli\n        elif me == \'ansible-pull\':\n            from ansible.cli.pull import PullCLI as mycli\n        elif me == \'ansible-doc\':\n            from ansible.cli.doc import DocCLI as mycli\n        elif me == \'ansible-vault\':\n            from ansible.cli.vault import VaultCLI as mycli\n        elif me == \'ansible-galaxy\':\n            from ansible.cli.galaxy import GalaxyCLI as mycli\n\n        cli = mycli(sys.argv, display=display)\n        if cli:\n            cli.parse()\n            sys.exit(cli.run())\n        else:\n            raise AnsibleError("Program not implemented: %s" % me)\n\n    except AnsibleOptionsError as e:\n        cli.parser.print_help()\n        display.error(str(e), wrap_text=False)\n        sys.exit(5)\n    except AnsibleParserError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(4)\n# TQM takes care of these, but leaving comment to reserve the exit codes\n#    except AnsibleHostUnreachable as e:\n#        display.error(str(e))\n#        sys.exit(3)\n#    except AnsibleHostFailed as e:\n#        display.error(str(e))\n#        sys.exit(2)\n    except AnsibleError as e:\n        display.error(str(e), wrap_text=False)\n        sys.exit(1)\n    except KeyboardInterrupt:\n        display.error("User interrupted execution")\n        sys.exit(99)\n    except Exception as e:\n        have_cli_options = cli is not None and cli.options is not None\n        display.error("Unexpected Exception: %s" % str(e), wrap_text=False)\n        if not have_cli_options or have_cli_options and cli.options.verbosity > 2:\n            display.display("the full traceback was:\\n\\n%s" % traceback.format_exc())\n        else:\n            display.display("to see the full traceback, use -vvv")\n        sys.exit(250)\n']]
Installing 'zc.recipe.egg'.
We have the distribution that satisfies 'zc.recipe.egg==2.0.1'.
Installing 'z3c.recipe.mkdir'.
We have the distribution that satisfies 'z3c.recipe.mkdir==0.6'.
Installing 'z3c.recipe.filetemplate'.
We have the distribution that satisfies 'z3c.recipe.filetemplate==2.2.0'.
Installing 'biodec.aws.multi'.
We have a develop egg: biodec.aws.multi 0.0.0
!!!!!! WARNING: Credential file unreadable. Skipping awscli scripts generation. !!!!!
Installing 'collective.recipe.omelette'.
We have the distribution that satisfies 'collective.recipe.omelette==0.16'.
Updating _mr.developer.
Installing 'mr.developer'.
We have the distribution that satisfies 'mr.developer==1.31'.
Getting required 'zc.buildout==2.4.4'
We have the distribution that satisfies 'zc.buildout==2.4.4'.
Getting required 'setuptools==16.0'
We have the distribution that satisfies 'setuptools==16.0'.
Adding find link 'https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790' from setuptools 16.0
Adding find link 'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2' from setuptools 16.0
Updating roles.
roles: set permissions for /home/centos/installation-scripts/installation/parts/roles
Updating src.
src: set permissions for /home/centos/installation-scripts/installation/parts/src
Updating templates.
Updating python.
Installing 'boto'.
We have the distribution that satisfies 'boto==2.38.0'.
Generated script '/home/centos/installation-scripts/installation/bin/sdbadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/elbadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/cfadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/s3put'.
Generated script '/home/centos/installation-scripts/installation/bin/fetch_file'.
Generated script '/home/centos/installation-scripts/installation/bin/launch_instance'.
Generated script '/home/centos/installation-scripts/installation/bin/list_instances'.
Generated script '/home/centos/installation-scripts/installation/bin/taskadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/kill_instance'.
Generated script '/home/centos/installation-scripts/installation/bin/bundle_image'.
Generated script '/home/centos/installation-scripts/installation/bin/pyami_sendmail'.
Generated script '/home/centos/installation-scripts/installation/bin/lss3'.
Generated script '/home/centos/installation-scripts/installation/bin/cq'.
Generated script '/home/centos/installation-scripts/installation/bin/route53'.
Generated script '/home/centos/installation-scripts/installation/bin/cwutil'.
Generated script '/home/centos/installation-scripts/installation/bin/instance_events'.
Generated script '/home/centos/installation-scripts/installation/bin/asadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/glacier'.
Generated script '/home/centos/installation-scripts/installation/bin/mturk'.
Generated script '/home/centos/installation-scripts/installation/bin/dynamodb_dump'.
Generated script '/home/centos/installation-scripts/installation/bin/dynamodb_load'.
Updating aws-cli.
Updating doxee-ansible-tools.
Installing 'doxee.ansible-tools'.
We have a develop egg: doxee.ansible-tools 1.0
Getting required 'troposphere==1.1.1.post1'
We have a develop egg: troposphere 1.1.1.post1
Getting required 'pyaml==15.6.3'
We have the distribution that satisfies 'pyaml==15.6.3'.
Getting required 'netaddr==0.7.15'
We have the distribution that satisfies 'netaddr==0.7.15'.
Getting required 'PyYAML==3.11'
We have the distribution that satisfies 'PyYAML==3.11'.
Updating omelette.
Installing 'doxee.ansible-tools', 'ipython', 'ipdb'.
We have a develop egg: doxee.ansible-tools 1.0
We have the distribution that satisfies 'ipython==3.2.1'.
We have the distribution that satisfies 'ipdb==0.8.1'.
Getting required 'troposphere==1.1.1.post1'
We have a develop egg: troposphere 1.1.1.post1
Getting required 'pyaml==15.6.3'
We have the distribution that satisfies 'pyaml==15.6.3'.
Getting required 'netaddr==0.7.15'
We have the distribution that satisfies 'netaddr==0.7.15'.
Getting required 'PyYAML==3.11'
We have the distribution that satisfies 'PyYAML==3.11'.
omelette: Warning: (While processing egg PyYAML) Package '_yaml' not found.  Skipping.
Updating dev-tools.
Installing 'ipython', 'ipdb'.
We have the distribution that satisfies 'ipython==3.2.1'.
We have the distribution that satisfies 'ipdb==0.8.1'.
Updating ansible.
Installing 'ansible == 2.0.0', 'boto'.
We have a develop egg: ansible 2.0.0
We have the distribution that satisfies 'boto==2.38.0'.
Getting required 'six==1.9.0'
We have the distribution that satisfies 'six==1.9.0'.
Getting required 'pycrypto==2.6.1'
We have the distribution that satisfies 'pycrypto==2.6.1'.
Getting required 'setuptools==16.0'
We have the distribution that satisfies 'setuptools==16.0'.
Adding find link 'https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790' from setuptools 16.0
Adding find link 'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2' from setuptools 16.0
Getting required 'PyYAML==3.11'
We have the distribution that satisfies 'PyYAML==3.11'.
Getting required 'jinja2==2.7.3'
We have the distribution that satisfies 'jinja2==2.7.3'.
Getting required 'paramiko==1.15.2'
We have the distribution that satisfies 'paramiko==1.15.2'.
Getting required 'markupsafe==0.23'
We have the distribution that satisfies 'markupsafe==0.23'.
Getting required 'ecdsa==0.13'
We have the distribution that satisfies 'ecdsa==0.13'.
Generated script '/home/centos/installation-scripts/installation/bin/ansible'.
Generated script '/home/centos/installation-scripts/installation/bin/ansible-playbook'.
Generated script '/home/centos/installation-scripts/installation/bin/ansible-pull'.
Generated script '/home/centos/installation-scripts/installation/bin/ansible-doc'.
Generated script '/home/centos/installation-scripts/installation/bin/ansible-galaxy'.
Generated script '/home/centos/installation-scripts/installation/bin/ansible-vault'.
Generated script '/home/centos/installation-scripts/installation/bin/sdbadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/elbadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/cfadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/s3put'.
Generated script '/home/centos/installation-scripts/installation/bin/fetch_file'.
Generated script '/home/centos/installation-scripts/installation/bin/launch_instance'.
Generated script '/home/centos/installation-scripts/installation/bin/list_instances'.
Generated script '/home/centos/installation-scripts/installation/bin/taskadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/kill_instance'.
Generated script '/home/centos/installation-scripts/installation/bin/bundle_image'.
Generated script '/home/centos/installation-scripts/installation/bin/pyami_sendmail'.
Generated script '/home/centos/installation-scripts/installation/bin/lss3'.
Generated script '/home/centos/installation-scripts/installation/bin/cq'.
Generated script '/home/centos/installation-scripts/installation/bin/route53'.
Generated script '/home/centos/installation-scripts/installation/bin/cwutil'.
Generated script '/home/centos/installation-scripts/installation/bin/instance_events'.
Generated script '/home/centos/installation-scripts/installation/bin/asadmin'.
Generated script '/home/centos/installation-scripts/installation/bin/glacier'.
Generated script '/home/centos/installation-scripts/installation/bin/mturk'.
Generated script '/home/centos/installation-scripts/installation/bin/dynamodb_dump'.
Generated script '/home/centos/installation-scripts/installation/bin/dynamodb_load'.

(auto-aws)[centos@ip-10-230-0-8 installation]$ bin/ansible --version
ansible 2.0.0 (detached HEAD 5ae74f7d38) last updated 2015/10/13 14:25:51 (GMT +000)
  lib/ansible/modules/core: (detached HEAD d659c79db7) last updated 2015/10/13 14:25:58 (GMT +000)
  lib/ansible/modules/extras: (detached HEAD 0ff1776a84) last updated 2015/10/13 14:26:04 (GMT +000)
  config file = /home/centos/installation-scripts/installation/ansible.cfg
  configured module search path = None
Contributor

reinout commented Oct 14, 2015

Can someone take a look at #273 so that I can merge it afterwards? The tests pass now.

reinout closed this in f31130a Oct 14, 2015

Contributor

reinout commented Oct 14, 2015

@visik7 @specialunderwear , can you check if it also works for you with the just-released 2.4.5 version?

visik7 commented Oct 17, 2015

confirmed working with 2.4.5

Contributor

reinout commented Oct 17, 2015

Hurray!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment