noqqe » blog | sammelsurium | photos | projects | about

Ansible Replace über mehrere Files

2019-07-16 @ ansible

Ich komme in der Arbeit leider zu selten in den Genuss etwas ansible zu machen, aber heute war es doch mal wieder so weit.

Gesucht habe ich ein Playbook welches Debian Jessie -> Stretch Updates macht. Ja, Buster ist bereits released, ich fühle mich bereits schlecht, macht es nicht noch schlimmer mit dem Hinweis darauf als Reaktion auf diesen Blogpost.

Gefunden habe ich dann dist-upgrade.yaml von DebOps. Leider sieht dieses Playbook nur Repos in /etc/apt/sources.list vor.

- name: Change current release in APT sources
  replace:
    dest: '/etc/apt/sources.list'
    regexp: '{{ dist_upgrade_current_release }}'
    replace: '{{ dist_upgrade_new_release }}'

Da meine Server aber alle per Puppet mit Repos bestückt werden, befinden sich dabei einzelne Files in /etc/apt/sources.list.d/. Was ich also tun musste war, die RegEx von replace auf mehrere Files anwenden.

- name: Find all apt sources.list files
  find:
    paths: "/etc/apt/"
    patterns: "*.list"
    recurse: yes
  register: repos

- name: Change current release in APT sources
  replace:
    dest: "{{ item.path }}"
    regexp: '{{ dist_upgrade_current_release }}'
    replace: '{{ dist_upgrade_new_release }}'
  with_items:
    - "{{ repos.files }}"

Die Doku zum find Ansible Modul war dabei sehr hilfreich, weil ich auch nicht wusste welche Art von Datentyp das Resultset von find dann ist. Kurz noch etwas durch die Doku geschaut wie man Variablen in einem Dict abgreift und schon wars fertig.

Mir gefällts, ob es den Menschen von DebOps auch taugt werden wir in PR #898 sehen