Variable registration is getting skipped in zypper module

I’m using the zypper and apt modules to update remote hosts. I don’t know if I’m missing something or it’s a bug, but registering a variable in the zypper module is getting skipped. It works fine in the apt module.

  • name: (SuSE) Update all packages to latest versions
    when: ansible_os_family == “Suse”
    zypper:
    name: ‘*’
    state: latest
    type: package
    update_cache: yes
    register: update_result

  • name: (Debian) Update all packages to latest versions

when: ansible_os_family == “Debian”
apt:
name: ‘*’
state: latest
update_cache: yes
force_apt_get: yes
autoremove: yes
register: update_result

This is the variable dump when using zypper. It’s always “changed”: false and “skipped”: true even if changes are made.

ok: [raamah] => {
“update_result”: {
“changed”: false,
“skip_reason”: “Conditional result was False”,
“skipped”: true
}
}

However, the apt module always returns values for “msg”, “stderr”, and “stdout” as seen below. Am I using the zypper module incorrectly or something?

ok: [webtest01] => {
“update_result”: {
“changed”: false,
“failed”: false,
“msg”: “Reading package lists…\nBuilding dependency tree…\nReading state information…\nCalculating upgrade…\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “Reading package lists…\nBuilding dependency tree…\nReading state information…\nCalculating upgrade…\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n”,
“stdout_lines”: [
“Reading package lists…”,
“Building dependency tree…”,
“Reading state information…”,
“Calculating upgrade…”,
“0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.”
]
}
}

You are registering to the same variable in both tasks. Ansible will register regardless of the task being skipped or not.

If the suse/zypper task executes, I assume that the apt task should skip, as such, the zypper task registered with real data first, and then the apt task overwrites the result with a skipped info.

You should be using different register variable names for each task, to avoid this issue.

Ah I see, thank you.

Still having some trouble with this. I changed the registered variables to apt_result and zypper_result:

  • name: (SuSE) Update all packages to latest versions
    when: ansible_os_family == “Suse”
    zypper:
    name: ‘*’
    state: latest
    type: package
    update_cache: yes
    register: zypper_result
  • name: (Debian) Update all packages to latest versions
    when: ansible_os_family == “Debian”
    apt:
    name: ‘*’
    state: latest
    update_cache: yes
    force_apt_get: yes
    autoremove: yes
    register: apt_result

But the zypper module returns completely different parameters than the apt module. Shouldn’t it contain stdout and stderr too? I’ve tried removing all the apt stuff to eliminate any conflicts but the results didn’t change. This is the zypper_result variable dump. It runs zypper update just fine on the host but I’m not getting the return values I want. At minimum I need the stdout and stderr output.

ok: [raamah] => {
“zypper_result”: {
“changed”: false,
“cmd”: [
“/usr/bin/zypper”,
“–quiet”,
“–non-interactive”,
“–xmlout”,
“update”,
“–type”,
“package”,
“–auto-agree-with-licenses”,
“–no-recommends”
],
“failed”: false,
“name”: [
“*”
],
“rc”: 0,
“state”: “latest”,
“update_cache”: true
}
}

The apt dump again:

ok: [webtest01] => {
“apt_result”: {
“changed”: false,
“failed”: false,
“msg”: “Reading package lists…\nBuilding dependency tree…\nReading state information…\nCalculating upgrade…\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n”,
“stderr”: “”,
“stderr_lines”: ,
“stdout”: “Reading package lists…\nBuilding dependency tree…\nReading state information…\nCalculating upgrade…\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n”,
“stdout_lines”: [
“Reading package lists…”,
“Building dependency tree…”,
“Reading state information…”,
“Calculating upgrade…”,
“0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.”
]
}
}

Hi,

       "cmd": [
           "/usr/bin/zypper",
           "--quiet",

the ansible zypper module calls zypper with --quiet, as you can check on
the commandline that leads to zypper not writing to stdout, if there's
nothing to do:

# zypper update
Loading repository data...
Reading installed packages...

Nothing to do.

Thanks, I thought that might be it. Seems pointless to suppress all the output. I used the “command” module instead with all the same parameters except --quiet and --xmlout and it’s working fine. And since I can’t use the “changed” parameter with command to see if any packages were updated (it always seems to return true), I’m instead checking its stdout for the string “Nothing to do”.