it-swarm.com.de

Ist es in Ansible möglich, die Authentifizierungsmethode pro Playbook zu definieren?

TL; DR: Ist es möglich, zwei Playbooks mit einem ansible-playbook-Befehl zu verketten, wobei ein Playbook die Kennwortauthentifizierung und das andere Playbook die Schlüsselauthentifizierung ist? (Siehe letzter Abschnitt für den tatsächlichen Zweck).

Konfiguration:

Ich habe zwei Spielbücher, von denen das zweite include das erste ist.

PlaybookA.yml

---
- name: PlaybookA # requires password authentication
  hosts: sub.domain.ext
  remote_user: root
  roles:
    - { role: role1, Sudo: yes }
...

PlaybookB.yml

---
- name: Run PlaybookA
  include: PlaybookA.yml

- name: PlaybookB # requires ssh-key authentication
  hosts: sub.domain.ext
  remote_user: ansible
  roles:
    - { role: role2, Sudo: yes }
...

Bedarf:

  1. Führe nur einen Befehl aus.
  2. Verwenden Sie die Kennwortauthentifizierung für PlaybookA.
  3. Verwende ssh-key auth für PlaybookB.

Frage 1:

Ist es innerhalb von Ansible (Version 1.9.4 oder niedriger) möglich, einen ansible-playbook-Befehl auszuführen, mit dem PlaybookB mit SSH-Schlüssel-Authentifizierung erfolgreich ausgeführt wird. Wenn PlaybookB jedoch PlaybookA enthält, führen Sie PlaybookA mit Kennwort-Authentifizierung aus?

Frage 2:

Wenn dies mit Ansible 1.9.4 oder niedriger nicht möglich ist, ist dies mit 2.0.0+ möglich?

Noten von Wert:

  1. Ansible stellt --ask-pass (oder -k) als Befehlszeilenschalter zur Verfügung, der die Kennwortauthentifizierung ermöglicht.
  2. Ansible stellt ask_pass als Variable zur Verfügung, aber es scheint, als könne es nur innerhalb von ansible.cfg festgelegt werden (ich konnte dies nicht als Playbook-Variable für den gewünschten Effekt festlegen).
  3. Der Versuch, ask_pass als Anweisung in einem Playbook festzulegen, führt zu folgendem Ergebnis: ERROR: ask_pass is not a legal parameter of an Ansible Play. Wenn dieser Parameter zulässig ist, können Sie auf Playbook-Ebene festlegen, welche Authentifizierungsmethode verwendet werden soll.

Zweck/reale Welt:

Ich versuche, mit Ansible einen Konfigurationsverwaltungsworkflow zu erstellen, der so einfach ist, dass andere bei der Arbeit in der Lage sind, ihn zu erlernen/anzupassen (und hoffentlich die Verwendung von Ansible im Allgemeinen für CM und Orchestrierung).

Für jede neue Maschine (VM oder physische), die gebaut wird, beabsichtige ich, sofort zwei Playbooks auszuführen. PlaybookA (wie oben gezeigt) ist dafür verantwortlich, sich mit dem richtigen Standardbenutzer anzumelden (in der Regel abhängig von der Infrastruktur [aws, vsphere, none, etc]). Einmal in, ist seine sehr begrenzte Aufgabe:

  1. Erstellen Sie den standardisierten Benutzer, unter dem ansible ausgeführt werden kann (und installieren Sie seinen SSH-Schlüssel).
  2. Entfernen Sie eventuell vorhandene Nicht-Root-Benutzer (Artefakte der VM-Infrastruktur usw.).
  3. Deaktivieren Sie den Root-Zugriff.
  4. Deaktivieren Sie die Kennwortauthentifizierung (ssh-key nur ab diesem Zeitpunkt).

Abhängig von der VM-Infrastruktur (oder deren Fehlen) kann der Standardbenutzer oder die Standardauthentifizierungsmethode unterschiedlich sein. Im Hinblick auf die Übernahme von Ansible versuche ich, die Dinge für Kollegen extrem einfach zu halten, daher möchte ich diese Ablaufsteuerung so weit wie möglich automatisieren.

Sobald PlaybookA die VM gesperrt und den standardisierten Benutzer eingerichtet hat, verwendet PlaybookB diesen standardisierten Benutzer, um alle anderen Vorgänge auszuführen, die erforderlich sind, um die VMs auf die erforderliche Basis an Tools und Dienstprogrammen usw. zu bringen.

Alle Tipps, Hinweise, Vorschläge wäre sehr dankbar.

8
Informatician

Ich bin heute mit demselben Problem konfrontiert. Hier können zwei Ideen hilfreich sein: Sie können das Kennwort mithilfe von vars_Prompt in Ihrem Playbook anstelle von --ask-pass Anfordern. Legen Sie das Kennwort mit set_fact fest:


- name: "set password for the play"

  set_fact: ansible_ssh_pass="{{ my_pass }}"

Sie können das Kennwort in einer Datei oder in der Eingabeaufforderung wie im folgenden Beispiel speichern. In meinem Beispiel verbietet die erstellte sshd-Konfiguration das Anmelden von Kennwörtern. Wenn Sie jedoch anpassbare Standardeinstellungen verwenden, werden Sie überrascht sein, dass das zweite Playbook immer noch ausgeführt wird (!), Obwohl ich die Erstellung eines Authorized_key "vergessen" habe. Das liegt daran, dass ansible die ControlPersist-Optionen von ssh verwendet und einfach die Verbindung zwischen einzelnen Aufgaben offen hält. Sie können das in ansible.cfg deaktivieren

Beispiel-Spielbuch:


- name: "MAKE BARE: Run preparatory steps on a newly acquired server"
  hosts: blankee

  tasks:
    - name: "set password for the play"
      set_fact: ansible_ssh_pass="{{ my_pass }}"

    - name: "Create directory {{ pathsts }}/registry/ansible-init"
      file: name="{{ pathsts }}/registry/ansible-init" state=directory owner=root group=www-data mode=770

    - name: "copy sshd config file"
      copy:
        src:    'roles/newhost/files/sshd_config'
        dest:   '/etc/ssh/sshd_config'
        owner:  'root'
        group:  'root'
        mode:   '0644'


    - name: "Check syntax of sshd configuration"
      Shell: sshd -t
      register: result
      changed_when: false
      failed_when: "result.rc != 0"

    - name: "Restart SSHD and enable Service to start at boot"
      service: name=sshd state=restarted
      changed_when: false

  vars:
    my_pass2: foobar

  vars_Prompt:
    - name: "my_pass"
      Prompt: "########## Enter PWD:\n "



- name: "Second run: This should authenticate w/out password:"
  hosts: blankee

  tasks:

    - name: "Create directory {{ pathsts }}/registry/ansible-init"
      file: name="{{ pathsts }}/registry/ansible-init22" state=directory owner=root group=www-data mode=770
6
mulleto

Ich kenne keinen Weg, um die Authentifizierungsmethode innerhalb des Spiels zu ändern. Ich denke, ich würde lieber zwei verschiedene Spielbücher als Jenkins-Job oder ähnliches ausführen, aber ich kann mir eine reine Ansible-Problemumgehung vorstellen: Anstatt das zweite Spielbuch einzuschließen, könnten Sie einen Shell-Befehl als lokale Aktion ausführen und ausführen Befehl zum Ausführen des zweiten Spielbuchs vom ersten. Hier ist ein grober Proof of Concept:

---
- hosts: all
  vars_files:
    - vars.yml
  tasks:
    - debug: msg="Run your first role here."

    - name: Then call Ansible to run the second playbook.
      local_action: Shell ansible-playbook -i ~/workspace/hosts ~/workspace/second_playbook.yml
      register: playbook_results

    - debug: var=playbook_results.stdout_lines

Hier ist die Ausgabe:

GATHERING FACTS *************************************************************** 
ok: [vagrantbox]

TASK: [debug msg="Run your first role here."] ********************************* 
ok: [vagrantbox] => {
    "msg": "Run your first role here."
}

TASK: [Then call Ansible to run the second playbook.] ************************* 
changed: [vagrantbox -> 127.0.0.1]

TASK: [debug var=playbook_results.stdout_lines] ******************************* 
ok: [vagrantbox] => {
    "var": {
        "playbook_results.stdout_lines": [
            "", 
            "PLAY [Proof of concept] ******************************************************* ", 
            "", 
            "GATHERING FACTS *************************************************************** ", 
            "ok: [vagrantbox]", 
            "", 
            "TASK: [debug msg=\"This playbook was called from another playbook!\"] *********** ", 
            "ok: [vagrantbox] => {", 
            "    \"msg\": \"This playbook was called from another playbook!\"", 
            "}", 
            "", 
            "PLAY RECAP ******************************************************************** ", 
            "vagrantbox                 : ok=2    changed=0    unreachable=0    failed=0   "
        ]
    }
}

PLAY RECAP ******************************************************************** 
vagrantbox                 : ok=4    changed=1    unreachable=0    failed=0   
0
nikobelia