/swarm_cluster_cli_ope

Little CMD Line for simplify life with a swarm cluster

Primary LanguageRubyMIT LicenseMIT

SwarmClusterCliOpe

WIP to translate Gemma per la gestione semplificata degli operatori con un cluster swarm

Installation

Add this line to your application's Gemfile:

gem 'swarm_cluster_cli_ope'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install swarm_cluster_cli_ope

Usage

Una volta installato lanciare il comando

swarm_cli_ope install che si occuperà di configurare le varie impostazioni dell'ambiente

FILE di configurazione base:

{"version":"0.1.0","dev_mode":1,"log_level": "3","connections_maps":{"swm1": "swarm_node_1","swm2": "swarm_node_2","swm3": "swarm_node_3"}}

LogLevel:

0 ERROR 1 WARN 2 INFO 3 DEBUG

ENV differenti

Tutti i comandi possono essere accompagnati con -e, per scopparli nel relativo ENVIRONMENT

Configuratione di un progetto

Si occupa di generare nel progetto il file di configurazione in cui impostare impostazioni specifiche di progetto quali stack_name (.swarm_cluster_project)

swarm_cli_ope configure_project STACK_NAME

Configurazioni applicate nel progetto:

swarm_cli_ope config

Elenco di tutti gli stack disponibili:

swarm_cli_ope stacks

MC:

Apre MC collegato al container del servizio specificato

swarm_cli_ope mc SERVICE_NAME --stack-name=NOME_STACK

SHELL:

Apre una shell (default bash) collegato al container del servizio specificato

swarm_cli_ope shell SERVICE_NAME --stack-name=NOME_STACK

Elenco di tutti i servizi

Se siamo nel progetto con il file di progetto vedremo comunque i servizi filtrati

swarm_cli_ope services

filtrando per stack:

swarm_cli_ope services --stack-name=NOME_STACK

Copia di files da/verso container attraverso il docker cp

swarm_cli_ope cp --stack-name=NOME_STACK PATH_FILE_LOCALE NOME_SERVIZIO:DESTINAZIONE_NEL_CONTAINER

Rsync da/a container a/da locale

Utilizzare rsync_binded_from per scaricare e rsync_binded_to per caricare

swarm_cli_ope rsync_binded_from --stack-name=STACK_NAME --service_name NOME_SERVIZIO_SENZA_STACK --binded-container-folders CARTELLA_CONTAINER --local-folder CARTELLA_DESTINAZIONE

stacksync

Si occupa di scaricare|caricare,utilizzando le configurazioni presenti, i dati dallo stack remoto

Le configurazioni sono contenute nell'array: sync_configs.

ogni configurazione è composta da:

    { 
       service:"" 
       how:"" 
       configs:{ }
      }
  • service è il nome del servizio (o nel caso di k8s una stringa da utilizzare come selettore labels)
  • how è il come sincronizzare, definendo la tipologia:
    • pg -> DB: dump del DB con pgdump
    • mysql -> DB: dump del db con mysqldump
    • sqlite3 -> DB: viene eseguita una copia del file
    • rsync -> RSYNC
    • mongodb -> mongodump e mongorestore
  • configs: è un hash con le configurazioni per ogni tipo di sincronizzazione

Possibili CFGS per tipologia:

  • rsync:
    • local: -> path cartella locale
    • remote: -> path cartella remota (contesto del container)
  • sqlite3:
    • local: -> path al file
    • remote: -> path al file remoto (contesto del container)
  • mysql:
    • local: -> hash di configurazioni per il DB locale
      • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
      • mysql_password_env: "MYSQL_PASSWORD" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: MYSQL_PASSWORD
      • mysql_password: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
      • mysql_user_env: "MYSQL_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: MYSQL_USER
      • mysql_user: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
      • database_name_env: "MYSQL_DATABASE" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: MYSQL_DATABASE
      • database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
    • remote: -> hash di configurazioni per il DB remoto
      • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
      • mysql_password_env: "MYSQL_PASSWORD" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: MYSQL_PASSWORD
      • mysql_password: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
      • mysql_user_env: "MYSQL_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: MYSQL_USER
      • mysql_user: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
      • database_name_env: "MYSQL_DATABASE" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: MYSQL_DATABASE
      • database_name: "MYSQL_DATABASE" -> valore in chiaro, in sostituzione della variabile ambiente
      • excluded_tables_data: [] -> elenco di tabelle di cui non scaricare i dati(solo lo schema), DEFAULT: []
  • pg:
    • local: -> hash di configurazioni per il DB locale
      • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
      • pg_password_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: POSTGRES_PASSWORD
      • pg_password: "" -> valore in chiaro, in sostituzione della variabile ambiente
      • pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
      • pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
      • database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
      • database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
    • remote: -> hash di configurazioni per il DB remoto
      • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
      • pg_password_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: POSTGRES_PASSWORD
      • pg_password: "" -> valore in chiaro, in sostituzione della variabile ambiente
      • pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
      • pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
      • database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
      • database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
  • mongo:
    • local: -> hash di configurazioni per il DB locale
      • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
      • password: "" -> password per DB
      • username: "" -> username per DB
      • database_name: "nome_db" -> nome del DB
      • exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PUSH, DEFAULT: ''
    • remote: -> hash di configurazioni per il DB remoto
      • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
      • password: "" -> password per DB
      • username: "" -> username per DB
      • database_name: "nome_db" -> nome del DB
      • exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PULL, DEFAULT: ''

EXAMPLE:

Esempio di sincronizzazione di un file sqlite3 e una cartella

    {
    "stack_name": "test1",
    "sync_configs": [
      {
        "service": "second",
        "how": "rsync",
        "configs": {
          "remote": "/test_bind",
          "local": "./uploads"
        }
      },
      {
        "service": "test_sqlite3",
        "how": "sqlite3",
        "configs": {
          "remote": "/cartella_sqlite3/esempio.sqlite3",
          "local": "./development.sqlite3"
        }
      }
    ]
    }

Development

nel file di configurazione creato nella home aggiungere la chiave "dev_mode":1 per collegarsi localmente

Abbiamo due tasks SWARM di simulazione

docker stack deploy -c test_folder/test_1/docker-compose.yml test_1_stack
docker stack deploy -c test_folder/test_1/docker-compose.yml test1_staging
docker stack deploy -c test_folder/test_2/docker_compose.yml test2

Per simulare una sincronizzazione fra locale e remoto di un mysql, lanciamo lo stesso stack anche come compose, in modo da trovarci sulla stessa macchina con tutte e due le situazioni

docker compose -f test_folder/test_1/docker-compose-local.yml up -d

K8s

Per Kubernetes dobbiamo avere minikube installato. lanciare quindi l'ambiente di test:

kubectl apply -f test_folder/test_k8s/test.yaml
docker compose -f test_folder/test_k8s/docker-compose-local.yml up -d

Release

To install this gem onto your local machine, run bundle exec rake install.

To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

License

The gem is available as open source under the terms of the MIT License.