Table of Contents

Integrare una repo esistente

Data una repo con la classica struttura:

.
├── ansible.cfg         # Config for ansible
├── files               # Where config files are stored to be copied on the remote
│   └── basic.txt
├── hosts               # All hosts and global vars
├── install.yaml        # Meta-playbook to execute
├── LICENSE
├── README.md
└── tasks               # Where all the tasks are stored
    ├── basics.yaml
    └── hello.yaml

Possiamo integrarla in Ansible Semaphore con i seguenti passaggi:

  1. Creare un progetto: non sempre è necessario ma per ordine sarebbe importante farlo. Inoltre i progetti permettono di definire permessi diversi su chi può eseguire e modificare le tasks.

  2. Aggiungere una chiave per accedere alla repository. Questo bisogna farlo nella sezione Key Store. Se la repository è pubblica e può essere clonata tramite https bisogna usare la chiave ti tipo None.

  3. Aggiungere la repository nella sezione Repositories.

  4. Creare un environment vuoto in quanto le variabili sono definite nel file hosts. Per farlo basta andare nella sezione Environment e inserire in entrambi i campi un json vuoto: {}

  5. Per eseguire le tasks sarà necessario avere una chiave di accesso verso i server. Generalmente questa chiave è di tipo ssh. Per aggiungere una chiave e necessario:

  • Collegarsi alla VM in cui semui viene hostato
  • Diventare l’user semui con il comando sudo -s su semui -s /bin/bash
  • Da qui è necessario vedere se una chiave ssh esiste già (molto probabilmente sì). La home di semui si trova in /opt/semui quindi la chiave si troverà in /opt/semui/.ssh/. Se la chiave esiste non serve ricrearla, se non esiste è necessario crearla con il comando ssh-keygen -t ed5519.
  • Copiare la chiave pubblica ed inserirla in tutti i server su cui si dovranno eseguire delle tasks
  • Dall’account di semui è necessario collegarsi con ssh verso tutti i server su cui si eseguiranno le tasks per aggiungere le loro chiavi ai known_hosts.
  • Copiare la chiave privata ed inserirla in una nuova chiave nella webui sotto la sezione Key store.
  1. Creare un inventario che sarà collegato al file hosts sulla repository. Per farlo basta andare nella sezione Inventory. Per le credenziali bisogna usare la chiave ssh aggiunta nel passo 4. Per il tipo selezionare File e scrivere il path del file hosts nella repo. Se la struttura è come quella presentata all’inizio basta scrivere hosts.

  2. Essendo che un classico install.yaml ha al sui interno tutte le tasks che possono essere eseguite in quella repository, bisogna dividere manualmente le tasks relative agli host in modo da poterle eseguire separatamente. Per farlo si va nella sezione Task Templates.

  • Si selezione il tipo Task
  • Come name si può mettere quello che si vuole, per essere consistenti andrebbe messo il nome dell’host (es. telegram-bot, dynamik, ecc.)
  • Per il Playbook Filename bisogna mettere install.yaml (sempre se la repository è come quella indicata sopra).
  • Per l’Inventory si mette quello creato in precedenza.
  • Per l’Environment si mette quello creato in precedenza.
  • Come argomenti aggiuntivi per la CLI dobbiamo specificare su tutto l’install, vogliamo eseguire solo le tasks relative ad un certo hosts (es. dynamik), quindi scriviamo ["--limit", "dynamik"]

Varie note:

  • Non clona i sottomoduli di una repo (https://github.com/ansible-semaphore/semaphore/issues/525)
  • Clona una repo ogni volta che si lancia una tasks che la riguarda
  • Per la chiave ssh è necessario diventare user semui sulla VM e generare coppia di chiavi. Da li per ogni macchina a cui ci si vuole collegare è necessario farlo a mano per la prima volta se no ansible si lamenta che non riesce a verificare la chiave remota.

Permessi sugli users

Semui è configurato con ldap, per accedere quindi si possono usare le proprie credenziali. Purtroppo però se si vuole diventare admin è necessario eseguire sulla macchina il seguente comando:

/opt/semui/semaphore user change-by-login --login {{ user }} --admin

Dove {{ user }} è il proprio nome utente che corrisponde a ldap