ansibleidempotent

How can I get the installed YUM packages with Ansible?


I am trying to get all the installed YUM packages on an RHEL machine. I can easily get it through using shell commands which is not idempotent and would like to use the YUM command instead.

The shell command works fine:

- name: yum list packages
  shell: yum list installed > build_server_info.config

But when I try to use the YUM command, it just executes, but it does not give any results:

- name: yum_command
  action: yum list=${pkg} list=available

Solution

  • I can easily get it through using shell commands which is not idempotent

    You can't really talk about idempotence, when you are querying the current state of a machine.

    "Idempontent" means that the task will ensure the machine is in the desired state no matter how many times you run a certain task.

    When you query current state, you don't describe the desired state. No matter what you do, what method you use, the term "idempotent" is just not applicable.


    Regarding your example, which does not give you results - you have repeated twice the same argument list and the task should fail (it doesn't, which looks like an Ansible quirk).

    To get a list of installed packages, you should use:

    - name: yum_command 
      yum:
        list=installed
      register: yum_packages
    
    - debug:
        var: yum_packages
    

    It saves a list of dictionaries describing each package to a variable yum_packages.

    You can then use a JSON Query Filter to get a single package (tar):

    - debug: var=item
      with_items: "{{yum_packages|json_query(jsonquery)}}"
      vars:
        jsonquery: "results[?name=='tar']"
    

    to get a result like this:

    "item": {
        "arch": "x86_64",
        "epoch": "2",
        "name": "tar",
        "nevra": "2:tar-1.26-31.el7.x86_64",
        "release": "31.el7",
        "repo": "installed",
        "version": "1.26",
        "yumstate": "installed"
    }
    

    Or only its version:

    - debug: var=item
      with_items: "{{yum_packages|json_query(jsonquery)}}"
      vars:
        jsonquery: "results[?name=='tar'].version"
    
    "item": "1.26"