Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ansible - Registered Variable Usage In Loop

Tags:

ansible

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.

like image 901
SPM Avatar asked Apr 15 '26 22:04

SPM


1 Answers

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
like image 134
Bruce P Avatar answered Apr 20 '26 17:04

Bruce P



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!