3

I would like to have git update with two different items (mango and apple) and in the next step display each individual checkout's latest versions.

- name: Checkout Mango and Apple
  git:
    repo: ssh://[email protected]:26545/{{ item }}.git
    dest: "{{ scriptdir }}/{{ item }}"
    key_file: "{{ rsa_key }}"
    accept_hostkey: yes
    update: yes
  with_items:
    - mango
    - apple
  register: checkoutVersion


- name: Display the checkoutVersion
  debug: msg="Checkout Version is {{ item.name }}"
  with_items:
    - checkoutVersion.after

Code Output :-

TASK: [makePkg | Checkout Mango and Apple ] **********************************************

ok: [127.0.0.1] => (item=mango) => {"after": "d3aa6131ec1a2e73f69ee150", "before": "d3aa6131ec1a2e73f69ee150", "changed": false, "item": "mango"}

ok: [127.0.0.1] => (item=primeribs) => {"after": "f9bb03466f248a9eb92c9656", "before": "f9bb03466f248a9eb92c9656", "changed": false, "item": "apple"}

TASK: [makePkg | Display the checkoutVersion] *********************************
fatal: [127.0.0.1] => One or more undefined variables: 'str object' has no attribute 'item'

FATAL: all hosts have already failed -- aborting

Please suggest how can I print each individual item's latest version.

1 Answer 1

4

I find that the best thing to do in a case like this is to write a small test case to see exactly how ansible behaves. For example:

- hosts: localhost
  gather_facts: False
  tasks:
    - command: /bin/echo {{ item }}
     register: foo
      with_items:
        - one
        - two
        - three

    - debug: var=foo

The output of the above playbook shows how ansible stores the results of the loop in the variable foo:

ok: [localhost] => {
    "foo": {
        "changed": true,
        "msg": "All items completed",
        "results": [
            {
                "changed": true,
                "cmd": [
                    "/bin/echo",
                    "one"
                ],
                "delta": "0:00:00.027182",
                "end": "2015-08-19 13:13:25.216657",
                "invocation": {
                    "module_args": "/bin/echo one",
                    "module_name": "command"
                },
                "item": "one",
                "rc": 0,
                "start": "2015-08-19 13:13:25.189475",
                "stderr": "",
                "stdout": "one"
            },
            {
                "changed": true,
                "cmd": [
                    "/bin/echo",
                    "two"
                ],
                "delta": "0:00:00.006270",
                "end": "2015-08-19 13:13:25.509316",
                "invocation": {
                    "module_args": "/bin/echo two",
                    "module_name": "command"
                },
                "item": "two",
                "rc": 0,
                "start": "2015-08-19 13:13:25.503046",
                "stderr": "",
                "stdout": "two"
            },
            {
                "changed": true,
                "cmd": [
                    "/bin/echo",
                    "three"
                ],
                "delta": "0:00:00.006347",
                "end": "2015-08-19 13:13:25.763675",
                "invocation": {
                    "module_args": "/bin/echo three",
                    "module_name": "command"
                },
                "item": "three",
                "rc": 0,
                "start": "2015-08-19 13:13:25.757328",
                "stderr": "",
                "stdout": "three"
            }
        ]
    }
}

So the actual results are provided in the list foo.results. If we change the debug task slightly we can iterate through these results one by one:

  - debug: var=item
    with_items: foo.results

This returns the following:

ok: [localhost] => (item={u'stdout': u'one', u'changed': True, u'end': u'2015-08-19 13:17:39.884374', 'item': 'one', u'cmd': [u'/bin/echo', u'one'], u'rc': 0, u'start': u'2015-08-19 13:17:39.878585', u'stderr': u'', u'delta': u'0:00:00.005789', 'invocation': {'module_name': u'command', 'module_args': u'/bin/echo one'}}) => {
    "item": {
        "changed": true,
        "cmd": [
            "/bin/echo",
            "one"
        ],
        "delta": "0:00:00.005789",
        "end": "2015-08-19 13:17:39.884374",
        "invocation": {
            "module_args": "/bin/echo one",
            "module_name": "command"
        },
        "item": "one",
        "rc": 0,
        "start": "2015-08-19 13:17:39.878585",
        "stderr": "",
        "stdout": "one"
    }
}
ok: [localhost] => (item={u'stdout': u'two', u'changed': True, u'end': u'2015-08-19 13:17:40.137575', 'item': 'two', u'cmd': [u'/bin/echo', u'two'], u'rc': 0, u'start': u'2015-08-19 13:17:40.131803', u'stderr': u'', u'delta': u'0:00:00.005772', 'invocation': {'module_name': u'command', 'module_args': u'/bin/echo two'}}) => {
    "item": {
        "changed": true,
        "cmd": [
            "/bin/echo",
            "two"
        ],
        "delta": "0:00:00.005772",
        "end": "2015-08-19 13:17:40.137575",
        "invocation": {
            "module_args": "/bin/echo two",
            "module_name": "command"
        },
        "item": "two",
        "rc": 0,
        "start": "2015-08-19 13:17:40.131803",
        "stderr": "",
        "stdout": "two"
    }
}
ok: [localhost] => (item={u'stdout': u'three', u'changed': True, u'end': u'2015-08-19 13:17:40.368420', 'item': 'three', u'cmd': [u'/bin/echo', u'three'], u'rc': 0, u'start': u'2015-08-19 13:17:40.362533', u'stderr': u'', u'delta': u'0:00:00.005887', 'invocation': {'module_name': u'command', 'module_args': u'/bin/echo three'}}) => {
    "item": {
        "changed": true,
        "cmd": [
            "/bin/echo",
            "three"
        ],
        "delta": "0:00:00.005887",
        "end": "2015-08-19 13:17:40.368420",
        "invocation": {
            "module_args": "/bin/echo three",
            "module_name": "command"
        },
        "item": "three",
        "rc": 0,
        "start": "2015-08-19 13:17:40.362533",
        "stderr": "",
        "stdout": "three"
    }
}

So I would suggest that you first change your debug task to be just this initially:

- name: Display the checkoutVersion
  debug: var=checkoutVersion

Use this to see exactly what sort of output the git module provides, then expand on that to do exactly what you want.

Given the output that you did provide above, then the final debug statement you'll want is something along these lines:

- name: Display the checkoutVersion
  debug: msg="Checkout Version is {{ item.after }}"
  with_items: checkoutVersion.results
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, this gentle approach pointed me in the right direction. However I could not reproduce the above example with ansible 2.9.6 today. Besides result there is a "ansible_loop_var": "item" which I was always getting instead of the response json.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.