Ansible : i3-wm Installation auf einem neuen Client

Ich hab hier ein bisschen gebastelt um meine ansible skills nicht zu verlieren.

Das Ansible installiert i3-wm mit meinen default configs ;-) wer möchte könnte auch zusätzlich polybar installieren, default ist i3-blocks. Mehr ist im Repo erklärt

https://github.com/Mokkujin/i3-config-ansible

Ansible : auflisten der remote folder

Hier werden alle remote Ordner aufgelistet unter dem vorgegeben Remote Pfad {{ dst_path }}
    - name: get directories
      shell: ls -1 "{{ dst_path }}"
      register: folders_test
anzeigen der ermittelten Ordner
    - name: show directories
      debug:
        msg: "Folder {{ item }}"
      with_items: "{{ folders_test.stdout_lines }}"

Ansible : Schleifen realisieren

Der Eintrag dient mir hauptsächlich als Gedächtnisstütze, braucht man nicht jeden Tag :-)

Eine einfache Schleife mit einem Counter von 1 bis 4 kann man so realisieren.
- hosts: localhost
  tasks:
    - name: loop test
      debug:
        msg: "{{ item }}"
      with_sequence: count=4
Liefert dann
TASK [loop test] ***************************************************************************************************
ok: [localhost] => (item=1) => {
    "msg": "1"
}
ok: [localhost] => (item=2) => {
    "msg": "2"
}
ok: [localhost] => (item=3) => {
    "msg": "3"
}
ok: [localhost] => (item=4) => {
    "msg": "4"
}

Verschachtelte Schleifen mit 2 dics kann man so realisieren (in diesem Beispiel wurden Benutzer die Rechte auf MySQL Datenbanken eingetragen)
- hosts: localhost
  tasks:
    - name: loop test
      debug:
        msg: "name {{ item[0] }} db : {{ item[1] }}.*:ALL"
      with_nested:
        - [ 'user01', 'user02' ]
        - [ 'db01', 'db02', 'db03' ]
Liefert dann
TASK [loop test] ***************************************************************************************************
ok: [localhost] => (item=[u'user01', u'db01']) => {
    "msg": "name user01 db : db01.*:ALL"
}
ok: [localhost] => (item=[u'user01', u'db02']) => {
    "msg": "name user01 db : db02.*:ALL"
}
ok: [localhost] => (item=[u'user01', u'db03']) => {
    "msg": "name user01 db : db03.*:ALL"
}
ok: [localhost] => (item=[u'user02', u'db01']) => {
    "msg": "name user02 db : db01.*:ALL"
}
ok: [localhost] => (item=[u'user02', u'db02']) => {
    "msg": "name user02 db : db02.*:ALL"
}
ok: [localhost] => (item=[u'user02', u'db03']) => {
    "msg": "name user02 db : db03.*:ALL"
}

Jetzt gibt es noch die Möglichkeit mit inner und outer loop zu arbeiten. Gestartet wird dann das playbook outer_loop.yaml

outer_loop.yaml
- hosts: localhost
  tasks:
    - include_tasks: inner_loop.yaml
      with_sequence: count=4
      loop_control:
        loop_var: IDX
inner_loop.yaml
- debug:
    msg: "create directory /opt/{{ item}}-{{ IDX }}"
  with_items:
    - dic1
    - dic2
    - dic3
Das liefert dann
TASK [debug] *******************************************************************************************************
ok: [localhost] => (item=dic1) => {
    "msg": "create directory /opt/dic1-1"
}
ok: [localhost] => (item=dic2) => {
    "msg": "create directory /opt/dic2-1"
}
ok: [localhost] => (item=dic3) => {
    "msg": "create directory /opt/dic3-1"
}

TASK [debug] *******************************************************************************************************
ok: [localhost] => (item=dic1) => {
    "msg": "create directory /opt/dic1-2"
}
ok: [localhost] => (item=dic2) => {
    "msg": "create directory /opt/dic2-2"
}
ok: [localhost] => (item=dic3) => {
    "msg": "create directory /opt/dic3-2"
}

TASK [debug] *******************************************************************************************************
ok: [localhost] => (item=dic1) => {
    "msg": "create directory /opt/dic1-3"
}
ok: [localhost] => (item=dic2) => {
    "msg": "create directory /opt/dic2-3"
}
ok: [localhost] => (item=dic3) => {
    "msg": "create directory /opt/dic3-3"
}

TASK [debug] *******************************************************************************************************
ok: [localhost] => (item=dic1) => {
    "msg": "create directory /opt/dic1-4"
}
ok: [localhost] => (item=dic2) => {
    "msg": "create directory /opt/dic2-4"
}
ok: [localhost] => (item=dic3) => {
    "msg": "create directory /opt/dic3-4"
}

Quellen :
Ansible Documentation - Loops
Ansible Documentation - Complex Loops

interessanter Trend ...

Habe gerade einen interessanten Trend zum Thema Ansible gefunden, aber schaut selbst.

Trend für Deutschland einsehen bei Google Trends

Ansible : Debian updaten

Hier ein Beispiel für ein Playbook das ein Update auf einem Debian System ausführt.
    - name: Update Repositories and update Distribution to the latest Version
      apt:
        update_cache: yes
        cache_valid_time: 21600
        upgrade: dist
        dpkg_options: 'force-confold,force-confdef'
      register: update_apt
      tags: update_apt

Ansible : mit pip ein Paket installieren

Auf einigen Servern werden verschiedene pip packete benötigt. Hier ein kleines Beispiel für paramiko. In diesem Beispiel wird pip auch aktualisiert und die letzte Version von paramiko installiert. Es wird auf dem Hostsystem pip benötigt, unter debian kann das mit apt install pip-python installiert werden.
    - name: install pip and update to newest version
      pip:
        name: pip
        state: latest
      register: pip_update
    - name: install paramiko
      pip:
        name: paramiko
        state: latest
      register: paramiko_install
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)