how to reference metadata in rax_facts

Hi All,

My Rackspace cloud servers are under managed services and under RackConnect services. This means than when they are built, first 2 other scripts need to run before I can actually use the server to provision it.

The peculiar thing is that during the RackConnect script the public ip of the server changes, so it in validates the data you “register” using the rax module when adding a server.

The fact is that we do not know precise when these build scripts have finished running. The only way to figure it out is either through the presence of a file in the servers /tmp directory or by querying the fact data received through the rackspace api. It should have a NVP set in the metatags field.

So basically what I want to do is:

  • create cloud server
  • poll factsdata until certain values are set
  • provision the server

The documentation of the rax_facts module does not provide a lot of info, event when copying the sample is fails due to “{{ rax_accessipv4 }}” not existing…

So who can help me out here or me into the right direction?

My current playbook:

  • name: Wait for Rackspace Managed Service provisioning completion
    hosts: raxtest
    gather_facts: False
    remote_user: root
    tasks:
  • name: Get meta data and check for completion of setup
    local_action:
    module: rax_facts
    api_key:
    username:
    register: result
    name: “{{ inventory_hostname }}”
    set_fact: managed_done = “{{rax_metadata.rax_service_level_automation}}”
    set_fact: ansible_ssh_host = “{{ rax_accessipv4 }}”
    until: managed_done = “Complete”

retries: 20
delay: 30

I have some sample plays that show how to wait for RackConnect automation and the Managed Cloud automation to complete before moving on. I haven’t gotten around to adding it to the Rackspace guide, but hope to do so soon.

You can see those sample playbooks:

https://github.com/sivel/ansible-samples/tree/master/rackconnect

In your specific case, the following lines are probably what you are in need of https://github.com/sivel/ansible-samples/blob/master/rackconnect/rackconnect-push-mode.yml#L49-L58

On another note, you cannot call a module from within another module. So your attempts at running set_fact inside of a local_action for rax_facts just can’t work.

PR has been submitted to include these examples in the Rackspace guide: https://github.com/ansible/ansible/pull/7650

Matt,

tx this was of great help!

We saw that wen adding the metadata for the LB Pools

meta:
RackConnectLBPool: marlintest

that strangely the name that is captured by the api is:

u’marlintest’ and as such the rackconnect script fails.

I tried putting " around it but no luck

Any ideas?

That issue is fixed in another pull request which is waiting to be merged:

https://github.com/ansible/ansible/pull/7122

PR #7122 has just been merged. It also includes a new module “rax_meta” for more easily allowing metadata updates on cloud servers.

Both “rax” and “rax_meta” use the improved metadata normalization code.

Matt,

Great, meta data is now correctly put into the api call…

However we still are having some problems. Sometimes the script goes faster then the meta data becomes available:

fatal: [web6] => error while evaluating conditional: rax_facts.ansible_facts.rax_metadata[‘rackconnect_automation_status’]|default(‘’) == ‘DEPLOYED’

We checked and the automation status metadata is not yet present and as such the check fails.

Jurgen

The “|default(‘’)” should handle individual meta data keys not being available.

I’ve never seen this happen. You might try running with -v to see what the calls to rax_facts are returning. rax_metadata should always be present and should always be a dict.