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?

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"

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


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

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

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"


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.


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
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.