Thanks, and I can probably do something with that. My inventory is ec2.py, so I'll have to look into how to supplement it with at least one extra group. I believe that's possible using an inventory directory, or else I'll write a wrapper script.
Along with that I think I'm still going to need to pass *some* new information from one play to the next, so I'd like to understand why the test.yml at the start of this thread isn't working as expected. Both plays run as "hosts: 127.0.0.1", but the second play doesn't seem to have access to variables or facts set by the first play. The docs at http://docs.ansible.com/playbooks_variables.html say that "Registered variables are valid on the host the remainder of the playbook run, which is the same as the lifetime of *facts* in Ansible. Effectively registered variables are just like facts." Then http://docs.ansible.com/set_fact_module.html says that "Variables are set on a host-by-host basis just like facts discovered by the setup module. These variables will survive between plays." In my test case neither set_fact nor register seems to be working as described. Information gathered in the first play isn't available to tasks in the second play. I suspect ansible's getting confused about the hosts. Both plays have "hosts: 127.0.0.1", but the output shows 127.0.01 for the first play and localhost for the second. For this test my global inventory file is the only one in scope, and it has this entry: localhost ansible_connection=local ansible_python_interpreter=/usr/local/bin/python If I change test.yml to target "hosts: localhost" for both plays, then my test.yml works. Using hostvars on 127.0.0.1 also works, but feels like it shouldn't be necessary: # test.yml - hosts: 127.0.0.1 tasks: - set_fact: hostname_test='fubar' - add_host: name='{{ hostname_test }}' register: resp - debug: msg='{{ resp }}' - hosts: 127.0.0.1 tasks: - debug: msg='resp={{ resp|default("None") }}' - debug: msg='hostname_test={{ hostname_test|default("None") }}' - debug: msg='resp={{ hostvars["127.0.0.1"]["resp"]|default("None") }}' - debug: msg='hostname_test={{ hostvars["127.0.0.1"]["hostname_test"]|default("None") }}' # end Partial output: TASK: [debug msg='resp=None'] ************************************************* ok: [localhost] => { "msg": "resp=None" } TASK: [debug msg='hostname_test=None'] **************************************** ok: [localhost] => { "msg": "hostname_test=None" } TASK: [debug msg='resp={{ hostvars["127.0.0.1"]["resp"]|default("None") }}'] *** ok: [localhost] => { "msg": "resp={'invocation': {'module_name': u'add_host', 'module_args': u\"name='fubar'\"}, 'new_host': u'fubar'}" } TASK: [debug msg='hostname_test={{ hostvars["127.0.0.1"]["hostname_test"]|default("None") }}'] *** ok: [localhost] => { "msg": "hostname_test=fubar" } The first two debugs output None while the second two output the expected values. Apparently ansible (1.8.4) is smart enough to map 127.0.0.1 to localhost, but does so in a way that breaks variable scope across plays. Bug? -- Mike On Tuesday, March 10, 2015 at 12:26:07 AM UTC-7, Tomasz Kontusz wrote: > > Play's hosts are rendered pretty early, I think you can only use > --extra-vars in there. But you can put a group name in the second play, and > add that dynamic host to that group. > > Michael Blakeley <michael....@gmail.com <javascript:>> napisał: > >I'm doing some cloud scripting that involves some work on one host, > >then > >using the results to take action on another host. The hostname of the > >second host is a dynamic result of that first bit, and won't be in my > >inventory. I'd like to do as much of it as possible in ansible, and > >`add_host` seems to be working. But I'm having trouble using a variable > >or > >fact from one play as the `hosts` value for the next play. > > > >Here's a test case that I've been working on: I've made it as simple as > > > >possible. > > > ># test.yml > >- hosts: 127.0.0.1 > > tasks: > > - set_fact: hostname_test='fubar' > > - add_host: name='{{ hostname_test }}' > > register: resp > > - debug: msg='{{ resp }}' > > > >- hosts: 127.0.0.1 > > tasks: > > - debug: msg='resp={{ resp|default("None") }}' > > - debug: msg='hostname_test={{ hostname_test|default("None") }}' > > > ># end > > > >I'd like that second play to start with `- hosts: hostname_test`. But > >that > >results in "skipping: no hosts matched". At first I thought that meant > >`add_host` wasn't working. But if I hardcode `hosts: fubar` for the > >second > >play then ansible tries to connect as expected. However I need to > >determine > >the second hostname as part of the first play. Running the code as > >above > >suggests that neither `set_fact` nor `register` persists from the first > > > >play to the next: both seem to be undefined. > > > >Is it possible to use a hostname determined in one play as the hosts > >value > >for the next play? If so, what am I doing wrong? Is there a better way > >to > >persist new information from one play to the next? > > > >Is it significant that ansible reports the first play under > >`127.0.0.1`, as > >in the yml, but the second play shifts to `localhost`? > > > >Thanks in advance for any help. > > > >$ ansible --version > >ansible 1.8.4 > > configured module search path = None > >$ ansible-playbook -v test.yml > > > >PLAY [127.0.0.1] > >************************************************************** > > > >GATHERING FACTS > >*************************************************************** > >ok: [127.0.0.1] > > > >TASK: [set_fact hostname_test='fubar'] > >**************************************** > >ok: [127.0.0.1] => {"ansible_facts": {"hostname_test": "fubar"}} > > > >TASK: [add_host name='{{ hostname_test }}'] > >*********************************** > >ok: [127.0.0.1] => {"new_host": "fubar"} > > > >TASK: [debug msg='{{ resp }}'] > >************************************************ > >ok: [127.0.0.1] => { > > "msg": "{'invocation': {'module_name': u'add_host', 'module_args': > >u\"name='fubar'\"}, 'new_host': u'fubar'}" > >} > > > >PLAY [127.0.0.1] > >************************************************************** > > > >GATHERING FACTS > >*************************************************************** > >ok: [localhost] > > > >TASK: [debug msg='resp=None'] > >************************************************* > >ok: [localhost] => { > > "msg": "resp=None" > >} > > > >TASK: [debug msg='hostname_test=None'] > >**************************************** > >ok: [localhost] => { > > "msg": "hostname_test=None" > >} > > > >PLAY RECAP > >******************************************************************** > >127.0.0.1 : ok=4 changed=0 unreachable=0 > >failed=0 > >localhost : ok=3 changed=0 unreachable=0 > >failed=0 > > -- > Wysłane za pomocą K-9 Mail. > -- You received this message because you are subscribed to the Google Groups "Ansible Project" group. To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscr...@googlegroups.com. To post to this group, send email to ansible-project@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/7d1733cb-517e-4f2e-926f-02ba90aa92a3%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.