web-dev-qa-db-de.com

Änderung der Ansible-Schleife aufgrund von Version 2.12

Ich führe ein Playbook aus, das mehrere Pakete definiert, die über apt installiert werden sollen:

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

Ein aktuelles Ansible-Update auf meinem System zeigt jetzt diese Meldung bezüglich des oben genannten Spielbuchs an:

[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. 

Wenn ich das richtig verstehe, möchte Ansible jetzt diese Liste von Paketen als Array, das dies hinterlässt:

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']

Gibt es einen besseren Weg? Es scheint nur so, als würde ich für immer in VIM scrollen und versuchen, dies aufrechtzuerhalten. Entweder das oder Word umwickeln und behandeln eine Word-Cloud von Paketen.

12
Server Fault

Sie können das Array im YAML-Stil codieren, um es lesbarer zu machen:

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

Ich bin auf genau dasselbe Problem gestoßen, aber mit einer viel längeren Liste von Apps, die in einer VARS-Datei enthalten sind. Dies ist der Code, den ich implementiert habe, um dieses Problem zu umgehen. Die Liste der Apps wird in die Variable "apps" gestellt und Ansible iteriert darüber.

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

Die Datei mit der Liste der zu installierenden Apps befindet sich im Verzeichnis "Defaults" im Rollenverzeichnis für diese Aufgabe, dh im "allgemeinen" Rollenverzeichnis.

roles
    - common
      - Defaults
        - main.yml
1
Nick

Ich hatte die gleiche Frage und es sieht so aus, als müsste jeder Satz von Paketen mit dem gleichen Status ein eigener Block sein. Wenn ich mir Ansible's Dokumentation anschaue, gibt es für jeden Staat einen Block als Beispiel. Ich nahm dieses Beispiel, schnitt meine Pakete nach ihren Zuständen auf und folgte dem Beispiel von ignacio, und es funktionierte perfekt.

Im Grunde würde es so aussehen

- 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

Hoffe das macht Sinn und hilft!

0
Sikh