Benutzer-Werkzeuge

Webseiten-Werkzeuge


pc:ansible

Automatische Installationen mit Ansible

Vorbereiten des Clients

Bei moderneren Debian- Dists ist das systemweite Python gegen Veränderungen geschützt.

Wenn Ansible auf dem Client also besondere Module (z.B. Docker) braucht, muß man auf dem Client erst ein VirtualEnv speziell für die Ansible- Installationen vorbereiten:

  sudo apt install python3.14-venv
  python3 -m venv ansible_python_venv
  cd ansible_python_venv/
  source bin/activate
  pip install docker

Den Pfad <homedir>/ansible_python_venv benutzt man dann in den Playbooks 1)

Vorbereiten des Hosts

setup venv

python -m venv .venv
source .venv/bin/activate

install Ansible

pip install ansible

wir basteln und eine inventory- Datei

inventory.yaml
all:
  hosts:
    docker_test: 192.168.56.103

Dann brauchen wir unseren public SSH key:

erstmal checken, das wir nicht schon einen haben

ls -l ~/.ssh

dann erzeugen

ssh-keygen -t ed25519

und an den anderen Rechner übertragen-

  ssh-copy-id -i ~/.ssh/id_ed25519.pub benutzer@server-ip

speichern des github- Tokens:

export EDITOR=nano
ansible-vault create secrets.yml
gituser: stko
gitpass: <yourgittoken>

Git credentials als Parameter einbauen

Wenn das Playbook Daten aus privaten Repositories ziehen soll, wird's tricky 2):

  • Zuerst einmal muss man sich im privaten Repository ein Token mit Pull Repository Rechten anlegen (<TOKEN>)
  • dann baut man in den playbook- git Befehl in den Repository- URL die Parameter ein:
   repo: "https://git:{{ githubpassword | urlencode | replace ('/', '%2f') }}@git.s26314....
   

und übergibt den Parameter dann beim Start von ansible-playbook

  ansible-playbook -i hosts github.yml -e "githubpassword=<TOKEN>"
  
  

Ein Beispiel- Playbook, verallgemeinert aus einer Arbeit einer Kollegin:

---
- name: Deploy YOURPROGRAM on Raspberry Pi
  hosts: yourprogram_devices
  become: yes

  vars:
    user: pi
    home_dir: "/home/pi"
    module_dir: "{{ home_dir }}/installdir"
    yourprogram_dir: "{{ module_dir }}/yourprogram"
    docker_compose_version: "v2.23.3"
    ansible_python_interpreter: /usr/bin/python3
 

  tasks:

    - name: Update & upgrade packages
      apt:
        update_cache: yes
        upgrade: dist
        cache_valid_time: 3600

    - name: Install required packages
      apt:
        name:
          - git
          - python3-venv
          - python3-pip
          - python3-virtualenv

        state: present
 
    # in case of re-deployment, remove existing dir
    - name: Remove existing dir if exists
      ansible.builtin.file:
        state: absent
        path: "{{ module_dir }}"
 

    - name: ensures {{ module_dir }} dir exists
      file: 
        path: "{{ module_dir }}"
        state: directory
 

    - name: Clone YOURPROGRAM repositories
      git:
        repo: "{{ item.repo }}"
        dest: "{{ module_dir }}/{{ item.name }}"
      loop:
        - { name: labdash, repo: "https://git:{{ githubpassword | urlencode | replace ('/', '%2f') }}@github.com/stko/labdash.git" }
        - { name: labdash_internal, repo: "https://git:{{ githubpassword | urlencode | replace ('/', '%2f') }}@git.s26314.creoline.cloud/toplevel/inhouse/labdash_internal.git" }
        - { name: yourprogram, repo: "https://git:{{ githubpassword | urlencode | replace ('/', '%2f') }}@git.s26314.creoline.cloud/toplevel/inhouse/yourprogram.git" }
 
    # - name: Create Python virtual environment
    #   ansible.builtin.command: python3 -m venv .venv
    #   args:
    #     chdir: "{{ yourprogram_dir }}"
    #     creates: "{{ yourprogram_dir }}/.venv"
 
    # - name: update pip in virtual environment
    #   ansible.builtin.command: python3 -m pip install --upgrade pip
    #   args:
    #     chdir: "{{ yourprogram_dir }}"
    #     creates: "{{ yourprogram_dir }}/.venv/bin/pip"
 
    # - name: install setuptools in virtual environment
    #   ansible.builtin.command: python3 -m pip install --upgrade setuptools packaging
    #   args:
    #     chdir: "{{ yourprogram_dir }}"
    #     #creates: "{{ yourprogram_dir }}/.venv/bin/pip"
 
 
   # - name: Ensure packaging is installed system-wide
   #   ansible.builtin.raw: '{{ ansible_python_interpreter }} -m pip install --quiet packaging'

    - name: Install Python dependencies
      ansible.builtin.pip:
        requirements: "{{ yourprogram_dir }}/requirements.txt"
        virtualenv: "{{ yourprogram_dir }}/.venv"
        virtualenv_python: python3
        virtualenv_site_packages: yes
      register: pip_result
 
    # - name: Install editable dependencies
    #   ansible.builtin.pip:
    #     name: "{{ item }}"
    #     virtualenv: "{{ yourprogram_dir }}/.venv"
    #     virtualenv_python: python3
    #     virtualenv_site_packages: yes
    #     editable: yes
    #   loop:
    #     - "{{ module_dir }}/cnclib"
    #     - "{{ module_dir }}/tcpc"
    #     - "{{ module_dir }}/MTDS_modify"
    #     - "{{ module_dir }}/mtqr/python"
    #     - "{{ module_dir }}/labdash"
 

    - name: Add a line to a file if the file does not exist, without passing regexp
      ansible.builtin.lineinfile:
        path: /etc/sysctl.d/98-rpi.conf
        line: net.ipv4.ip_forward = 1
        create: yes
 
    # - name: Install Docker
    #   ansible.builtin.shell: curl -fsSL https://get.docker.com | sh
    #   args:
    #     creates: /usr/bin/docker
 
    # - name: Add user to Docker group
    #   user:
    #     name: "{{ user }}"
    #     groups: docker
    #     append: yes
 
    # - name: ensures docker plugin dir exists
    #   file: 
    #     path: "{{ home_dir }}/.docker/cli-plugins/"
    #     state: directory
    #     mode: '0755'
 
 
    # - name: Install Docker Compose v2
    #   get_url:
    #     url: "https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-linux-aarch64"
    #     dest: "{{ home_dir }}/.docker/cli-plugins/docker-compose"
    #     mode: '0755'
 
  # Docker installation and setup https://github.com/docker/for-linux/issues/1105#issuecomment-913964377
 
    # - name: prepare network for docker installation
    #   ansible.builtin.shell: sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
 
##################  https://github.com/linuxserver/docker-wireguard/issues/138#issuecomment-1003173623 ##############
 
 
    # - name: Make sure docker is running
    #   ansible.builtin.systemd_service:
    #     state: started
    #     name: docker
 
    # - name: Deploy Docker services
    #   ansible.builtin.shell: docker compose up --build -d
    #   args:
    #     chdir: "{{ yourprogram_dir }}/test/rabbitmq"
 
 

    - name: Configure YOURPROGRAM systemd service
      copy:
        dest: /etc/systemd/system/yourprogram.service
        content: |
          [Unit]
          Description=YOURPROGRAM Description
          After=network.target
 
          [Service]
          ExecStart={{ yourprogram_dir }}/.venv/bin/python yourprogram.py
          WorkingDirectory={{ yourprogram_dir }}
          Restart=always
          User={{ user }}
 
          [Install]
          WantedBy=multi-user.target

    - name: Enable YOURPROGRAM service
      systemd:
        name: yourprogram.service
        enabled: yes
        state: started

Python Module installieren mit Pip

Scheinbar gibt es (mindestens beim Raspi) Probleme, dass der Pip- Routine schlichtweg derArbeitsspeicher ausgeht.. ?!? Ein Mittel dagegen ist, wenigstens den Speicherhunger von Pip etwas mit extra_args: –no-cache-dir einzudämmen:

  - name: Install Python dependencies
      ansible.builtin.pip:
        requirements: "{{ zuulac_dir }}/requirements_raw.txt"
        virtualenv: "{{ zuulac_dir }}/.venv"
        virtualenv_python: python3
        virtualenv_site_packages: yes
 

ERROR! [DEPRECATED]: community.docker.docker_compose has been removed

Hier hilft bislang das Nachinstallieren der passenden ansible- Bilbiothek 3)

  ansible-galaxy collection install community.docker:==3.4.0
pc/ansible.txt · Zuletzt geändert: von admin