Changing ansible loop due to v2.11 deprecation

13,477

Solution 1

You can code the array in YAML style to make it more readable:

- name: Install utility packages common to all hosts
  apt:
    name:
      - aptitude
      - jq
      - curl
      - git-core
      - at
    state: present
    autoclean: yes

Solution 2

I came across this exact same problem , but with a much longer list of apps , held in a vars file. This is the code I implemented to get around that problem. The list of the apps is placed into the "apps" variable and Ansible iterates over that.

- name: Install default applications
  apt:
    name: "{{item}}"
    state: latest
  loop: "{{ apps }}"
  when: ansible_distribution == 'Ubuntu' or ansible_distribution == 'Debian'
  tags:
     - instapps

The file holding the list of apps to install is in the Defaults directory in the role directory for this task - namely the "common" role directory.

roles
    - common
      - Defaults
        - main.yml

Solution 3

I had this same question and it looks like each set of packages with the same states will have to be their own block. Looking at Ansible's documentation, they have a block for each state as an example so I took that example, cut up my packages based off their states and followed ignacio's example and it ended up working perfectly.

So basically it would look like this

- name: Install packages required for log-deployment
  apt:
    name:
      - gcc
      - python-devel
    state: latest
    autoclean: yes

- name: Install packages required for log-deployment
  apt:
    name:
      - python
      - mariadb
      - mysql-devel
    state: installed

Hope that makes sense and helps!

Share:
13,477

Related videos on Youtube

Server Fault
Author by

Server Fault

Updated on June 04, 2022

Comments

  • Server Fault
    Server Fault over 1 year

    I'm running a playbook which defined several packages to install via apt:

        - name: Install utility packages common to all hosts
          apt:
            name: "{{ item }}"
            state: present
            autoclean: yes
          with_items:
            - aptitude
            - jq
            - curl
            - git-core
            - at
    ...
    

    A recent ansible update on my system now renders this message concerning the playbook above:

    [DEPRECATION WARNING]: Invoking "apt" only once while using a loop via squash_actions is deprecated. Instead of
     using a loop to supply multiple items and specifying `name: {{ item }}`, please use `name: [u'aptitude', 
    u'jq', u'curl', u'git-core', u'at', u'heirloom-mailx', u'sudo-ldap', u'sysstat', u'vim', u'at', u'ntp', 
    u'stunnel', u'sysstat', u'arping', u'net-tools', u'lshw', u'screen', u'tmux', u'lsscsi']` and remove the loop. 
    

    If I'm understanding this correctly, Ansible now wants this list of packages as an array which leaves this:

    name: [u'aptitude', u'jq', u'curl', u'git-core', u'at','heirloom-mailx', u'sudo-ldap', u'sysstat', u'vim', u'at', u'ntp',u'stunnel', u'sysstat', u'arping', u'net-tools', u'lshw', u'screen', u'tmux', u'lsscsi']
    

    Is there a better way? Just seems like I'll be scrolling right forever in VIM trying to maintain this. Either that, or word wrap it and deal with a word-cloud of packages.

  • Server Fault
    Server Fault about 5 years
    Thank you. Much better!
  • prehistoricpenguin
    prehistoricpenguin over 1 year