Ansible: posso eseguire il ruolo dalla riga di comando?


92

Supponiamo che io abbia un ruolo chiamato "apache"

Ora voglio eseguire quel ruolo sull'host 192.168.0.10 dalla riga di comando dall'host Ansible

ansible-playbook -i  "192.168.0.10" --role  "path to role"

C'è un modo per farlo?

Risposte:


84

Non sono a conoscenza di questa funzione, ma puoi utilizzare i tag per eseguire solo un ruolo dal tuo playbook.

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"

62

Con ansible 2.7 puoi fare questo:

$ cd /path/to/ansible/
$ ansible localhost -m include_role -a name=<role_name>
localhost | SUCCESS => {
    "changed": false,
    "include_variables": {
        "name": "<role_name>"
    }
}
localhost | SUCCESS => {
    "msg": "<role_name>"
}

Questo eseguirà il ruolo da / path / to / ansible / roles o il percorso del ruolo configurato.

Maggiori informazioni qui: https://github.com/ansible/ansible/pull/43131


1
Questo non risponde realmente alla domanda perché non c'è alcun riferimento al file YAML del ruolo esterno che @kari ha implementato e vuole includere. Ho la stessa domanda. Tuttavia, dopo aver letto questa risposta, capisco solo che è fattibile. Non so proprio come.
Kola

Spero di aver chiarito la risposta @Kola
Julius Žaromskis

1
Questo è rotto in Ansible 2.8. Registra solo messaggi di errore criptici come'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach,

Questa soluzione sembra funzionare per me con ansible 2.8.2. Sembra che abbia un problema nell'esposizione delle variabili ad altri ruoli inclusi nel ruolo originale (che non è un problema in un playbook). Ho provato a passare a -a "name=<role_name> public=yes", ma non è stato d'aiuto.
user2066480

Per capire cosa fa -m e -a vedi docs.ansible.com/ansible/latest/user_guide/modules_intro.html Fondamentalmente, questo è il modo in cui i moduli possono essere avviati dalla riga di comando ( -m <module-name>) con coppie chiave = valore come argomenti ( -a key=value)
andymel

22

Non esiste nulla di simile in Ansible, ma se questo è un caso d'uso frequente per te, prova questo script.
Mettilo da qualche parte all'interno del tuo PATH ricercabile sotto il nome ansible-role:

#!/bin/bash

if [[ $# < 2 ]]; then
  cat <<HELP
Wrapper script for ansible-playbook to apply single role.

Usage: $0 <host-pattern> <role-name> [ansible-playbook options]

Examples:
  $0 dest_host my_role
  $0 custom_host my_role -i 'custom_host,' -vv --check
HELP
  exit
fi

HOST_PATTERN=$1
shift
ROLE=$1
shift

echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."

export ANSIBLE_ROLES_PATH="$(pwd)/roles"
export ANSIBLE_RETRY_FILES_ENABLED="False"
ansible-playbook "$@" /dev/stdin <<END
---
- hosts: $HOST_PATTERN
  roles:
    - $ROLE
END

3
Ho creato una proposta di strumento "crea un ruolo ansible", vedremo: github.com/ansible/proposals/issues/131
jhutar

4
Sembra che sia stato implementato in Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0

Sì, per favore prova ansible localhost -m include_role -a name=myrole- funziona per me!
jhutar

ansible localhost -m include_role -a name=myroleè rotto poiché ansible 2.8. Registra solo messaggi di errore criptici come'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach

16

Potresti anche controllare il repository ansible-toolbox . Ti permetterà di usare qualcosa di simile

ansible-role --host 192.168.0.10 --gather --user centos --become my-role

13

Ho scritto un piccolo plugin Ansible, chiamato auto_tags, che genera dinamicamente per ogni ruolo nel tuo playbook un tag con lo stesso nome. Puoi trovarlo qui .

Dopo averlo installato (le istruzioni sono nella sostanza sopra) puoi quindi eseguire un ruolo specifico con:

ansible-playbook -i "192.168.0.10" --tags "name_of_role"


4

L'hai provato? è fantastico. Sto usando 'update-os' invece del ruolo 'apache' per fornire un esempio più significativo. Ho un ruolo chiamato diciamo ./roles/update-os/nel mio ./aggiungo un file chiamato ./role-update-os.ymlche assomiglia a:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os

Rendi questo file eseguibile ( chmod +x role-update-os.yml). Ora puoi correre e limitare a tutto ciò che hai nel tuo inventario, ./update-os.yml -i inventory-dev --limit 192.168.0.10il limite puoi anche passare i nomi dei gruppi.

  • --limit web,db > web e db è il gruppo definito nel tuo inventario
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Nota che puoi configurare ssh-keys e la policy sudoers per essere in grado di eseguire senza dover digitare la password: ideale per l'automazione, ci sono implicazioni sulla sicurezza con questo. quindi devi analizzare il tuo ambiente per vedere se è adatto.


2

in ansible 2.8 funziona in modo leggermente diverso

wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED => {
    "changed": true, 
    "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
    "dest": "/root/.ssh/id_rsa.github", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
    "mode": "0600", 
    "owner": "root", 
    "size": 3389, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
    "state": "file", 
    "uid": 0
}
localhost | CHANGED => {
    "changed": true, 
    "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
    "dest": "/root/.ssh/config", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f82552a9494e40403da4a80e4c528781", 
    "mode": "0644", 
    "owner": "root", 
    "size": 147, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
    "state": "file", 
    "uid": 0
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.