Ansible: Kann ich eine Rolle über die Befehlszeile ausführen?

87

Angenommen, ich habe eine Rolle namens "Apache"

Jetzt möchte ich diese Rolle auf Host 192.168.0.10 über die Befehlszeile von Ansible Host ausführen

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

Gibt es eine Möglichkeit, das zu tun?

Karl
quelle

Antworten:

82

Diese Funktion ist mir nicht bekannt, aber Sie können Tags verwenden, um nur eine Rolle in Ihrem Playbook auszuführen.

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

ansible-playbook webserver.yml --tags "apache"
abuzze
quelle
55

Mit ansible 2.7 können Sie dies tun:

$ 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>"
}

Dadurch wird die Rolle von / path / to / ansible / role oder dem konfigurierten Rollenpfad ausgeführt.

Lesen Sie hier mehr: https://github.com/ansible/ansible/pull/43131

Julius Žaromskis
quelle
Dies beantwortet die Frage nicht wirklich, da es keinen Verweis auf die externe Rolle gibt, die die YAML-Datei @kari implementiert hat und einbeziehen möchte. Ich habe die gleiche Frage. Nachdem ich diese Antwort gelesen habe, verstehe ich nur, dass es machbar ist. Ich weiß nur nicht wie.
Kola
Hoffentlich habe ich die Antwort @Kola
Julius Žaromskis
1
Dies ist in Ansible 2.8 kaputt. Es protokolliert nur kryptische Fehlermeldungen wie'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
Diese Lösung scheint für mich mit ansible 2.8.2 zu funktionieren. Es scheint ein Problem zu geben, Variablen anderen Rollen auszusetzen, die in der ursprünglichen Rolle enthalten sind (was in einem Playbook kein Problem darstellt). Ich habe versucht, zu wechseln -a "name=<role_name> public=yes", aber das hat nicht geholfen.
user2066480
22

In Ansible gibt es so etwas nicht, aber wenn dies ein häufiger Anwendungsfall für Sie ist, probieren Sie dieses Skript aus.
Fügen Sie es irgendwo in Ihren durchsuchbaren Pfad unter dem Namen ein 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
Konstantin Suworow
quelle
3
Ich habe einen Tool-Vorschlag zum Erstellen einer Ansible-Rolle erstellt. Wir werden sehen: github.com/ansible/proposals/issues/131
jhutar
4
Sieht so aus, als wäre es in Ansible 2.7 implementiert worden: github.com/ansible/ansible/pull/43131
EM0
Ja, bitte versuchen Sie es ansible localhost -m include_role -a name=myrole- funktioniert für mich!
Jhutar
ansible localhost -m include_role -a name=myroleist kaputt seit ansible 2.8. Es protokolliert nur kryptische Fehlermeldungen wie'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
16

Sie können auch das Ansible-Toolbox- Repository überprüfen . Es wird Ihnen ermöglichen, so etwas wie zu verwenden

ansible-role --host 192.168.0.10 --gather --user centos --become my-role
Sasha Miroshnychenko
quelle
12

Ich habe ein kleines Ansible-Plugin namens geschrieben auto_tags, das für jede Rolle in Ihrem Playbook dynamisch ein gleichnamiges Tag generiert. Sie finden es hier .

Nach der Installation (Anweisungen finden Sie oben) können Sie eine bestimmte Rolle ausführen mit:

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

rkrzr
quelle
4

Hast du das versucht? Es ist super cool. Ich verwende 'update-os' anstelle der Rolle 'apache', um ein aussagekräftigeres Beispiel zu geben. Ich habe eine Rolle Sagen wir mal genannt ./roles/update-os/in meine ./ich eine Datei hinzufügen genannt , ./role-update-os.ymldie wie folgt aussieht:

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

Machen Sie diese Datei ausführbar ( chmod +x role-update-os.yml). Jetzt können Sie das Limit ausführen und auf das beschränken, was Sie in Ihrem Inventar haben. ./update-os.yml -i inventory-dev --limit 192.168.0.10Sie können auch die Gruppennamen übergeben.

  • --limit web,db > web und db ist die in Ihrem Inventar definierte Gruppe
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Beachten Sie, dass Sie die ssh-keys- und sudoers-Richtlinie so konfigurieren können, dass sie ausgeführt werden kann, ohne dass ein Kennwort eingegeben werden muss - ideal für die Automatisierung, da dies Auswirkungen auf die Sicherheit hat. Daher müssen Sie Ihre Umgebung analysieren, um festzustellen, ob sie geeignet ist.

Y Melo
quelle
1

in ansible 2.8 funktioniert es etwas anders

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
}

berlinguyinca
quelle