2014-12-05 6 views
6

Ich erstelle ein Playbook, das zuerst einen neuen Benutzernamen erstellt. Ich möchte dann "moretasks.yml" als den neuen Benutzer ausführen, den ich gerade erstellt habe. Derzeit stelle ich remote_user für jede Aufgabe ein. Gibt es eine Möglichkeit, dass ich es einmal für die gesamte Aufgabenstellung einstellen kann? Ich konnte anscheinend keine Beispiele dafür finden und auch keinen meiner Versuche, remote_user um Hilfe zu bringen.Set remote_user für Aufgaben in Ansible playbook, ohne es pro Aufgabe zu wiederholen

Unten ist main.yml:

--- 
- name: Configure Instance(s) 
    hosts: all 
    remote_user: root 
    gather_facts: true 

    tags: 
    - config 
    - configure 

    tasks: 
    - include: createuser.yml new_user=username 
    - include: moretasks.yml new_user=username 
    - include: roottasks.yml #some tasks unrelated to username. 

moretasks.yml:

--- 
    - name: Task1 
    copy: 
     src: /vagrant/FILE 
     dest: ~/FILE 
    remote_user: "{{newuser}}" 

    - name: Task2 
    copy: 
     src: /vagrant/FILE 
     dest: ~/FILE 
    remote_user: "{{newuser}}" 

Antwort

7

Als erstes wollen Sie sicher sudo_user verwenden (Remote-Benutzer ist derjenige, der sich anmeldet, sudo_user ist derjenige, der die Aufgabe ausführt).

In Ihrem Fall sollten Sie die Aufgabe als ein anderer Benutzer (die zuvor erstellte) nur auf ausführen:

- include: moretasks.yml 
    sudo: yes 
    sudo_user: "{{ newuser }}" 

und diese Aufgaben ausgeführt werden {{newuser}} (Vergessen Sie nicht die Anführungszeichen)

Anmerkung: In den meisten Fällen sollten Sie remote_user als Host-Parameter betrachten. Es ist der Benutzer, der sich auf dem Computer anmelden darf und der über ausreichende Rechte zum Ausführen von Aufgaben verfügt. Für betriebliche Dinge sollten Sie sudo/sudo_user

+2

Ich dachte, sudo_user wäre der, der nur ausgeführt wird, wenn du eine sudo-Aktion ausführen musst? Ich möchte darauf hinweisen, dass die Benutzer, die ich erstelle, keine Sudoprivilegien haben. Alle Aktionen in "Moretasks" sind lokal zu Hause. Ist es immer noch angemessen (irreführend?), Den sudo_user-Ansatz zu verwenden? (Der Ansatz hat funktioniert) – Shark

+0

Sie haben Recht, @Shark. In der Dokumentation sudo_user: Dies ist der Standardbenutzer für sudo, wenn --sudo-user nicht angegeben ist oder 'sudo_user' nicht in einer Ansible-Play-Box angegeben ist. Der Standardwert ist der logischste: "root". – Esteban

+2

Beachten Sie, dass 'sudo' und' sudo_user' zugunsten von 'werden' und' werden_user' veraltet sind. http://docs.ansible.com/ansible/become.html#become – kkurian

7

Sie könnten dies in getrennten Stücke aufgeteilt? (Playbooks kann mehrere Stücke enthält)

--- 
- name: PLAY 1 
    hosts: all 
    remote_user: root 
    gather_facts: true 

    tasks: 
    - include: createuser.yml new_user=username 
    - include: roottasks.yml #some tasks unrelated to username. 

- name: PLAY 2 
    hosts: all 
    remote_user: username 
    gather_facts: false 

    tasks: 
    - include: moretasks.yml new_user=username 

Es gibt eine Gotcha mit separaten Stücken: Sie nicht Variablen mit register: oder set_fact: im ersten Spiel verwenden können Dinge im zweiten Spiel zu tun (diese Aussage nicht ganz richtig, die Variablen sind in hostvars verfügbar, aber ich empfehle, keine Variablen zwischen den Rollen zu verwenden). Definierte Variablen wie in group_vars und host_vars funktionieren einwandfrei.

Ein weiterer Tipp, den ich geben möchte, ist die Verwendung von roleshttp://docs.ansible.com/playbooks_roles.html. Während es am Anfang vielleicht komplizierter erscheint, ist es viel einfacher, sie wiederzuverwenden (wie Sie es anscheinend mit "createuser.yml" machen). Mit Blick auf die Art von Dingen, die Sie erreichen wollen, wird der Weg "alles einschließen" nicht mehr lange dauern.

+0

@ ProfHase85 die Antwort ist richtig, habe ich nicht ganz die Tatsache, dass Sie in Ihrem Fall nicht als "newuser" anmelden müssen. Immer noch die Antwort zu verlassen, Spielbücher aufteilen und Rollen verwenden sind gültige Tipps. –

+0

Ja, nur die Struktur dieser Code-Basis zu starten. Wenn es komplizierter wird, werde ich wahrscheinlich schauen, wie effektiv Rollen sein können. Für mich sah es einfach nach einer Möglichkeit aus, verschiedene XML-Dateien zu referenzieren, ohne sie tatsächlich "einzubinden". Es schien keine Funktionen hinzuzufügen, die du sonst nicht ausführen könntest. – Shark

Verwandte Themen