2016-05-23 5 views
2

Ich habe ein paar ansible Spielbücher, die manchmal im lokalen Kontext sinnvoll sind, ansonsten werden sie remote ausgeführt. Um das zu tun, dass ich delegate_to Direktive verwenden, aber das bedeutet auch, dass ich alle meine Aufgaben zu verdoppeln haben, zB .:Ansässig bedingt delegate_to local oder remote?

--- 
- hosts: all 
    gather_facts: no 

    tasks: 

    - name: Local command 
    command: hostname 
    register: target_host 
    when: vhost is undefined 
    delegate_to: 127.0.0.1 

# ---  

    - name: Remote command 
    command: hostname 
    register: target_host 
    when: vhost is defined 

Exec lokal:

$ ansible-playbook -i inv.d/test.ini play.d/delegate.yml 

PLAY [all] ******************************************************************** 

TASK: [Local command] ********************************************************* 
changed: [new-server -> 127.0.0.1] 

TASK: [Remote command] ******************************************************** 
skipping: [new-server] 

PLAY RECAP ******************************************************************** 
new-server     : ok=1 changed=1 unreachable=0 failed=0 

Exec auf Fern:

$ ansible-playbook -i inv.d/test.ini play.d/delegate.yml -e vhost=y 

PLAY [all] ******************************************************************** 

TASK: [Local command] ********************************************************* 
skipping: [new-server] 

TASK: [Remote command] ******************************************************** 
changed: [new-server] 

PLAY RECAP ******************************************************************** 
new-server     : ok=1 changed=1 unreachable=0 failed=0 

Gibt es eine klügere Möglichkeit zu sagen, ansible, wenn auf die lokale Umgebung zurückfallen? Zur Zeit verwende ich ansible==1.9.2.

Antwort

6

Wo Aufgaben ausgeführt werden sollten nicht in den Aufgaben definiert werden. Delegierung ist sinnvoll, wenn Tasks immer lokal oder auf einer verwandten Maschine (z. B. Datenbankhost oder Router) ausgeführt werden müssen, während das Playbook selbst und daher die meisten Tasks die auf Playbook-Ebene definierten Hosts ausführen.

Wenn Sie jedoch das gesamte Playbook entweder lokal oder auf einer Gruppe von Remote-Hosts ausführen möchten, sollten Sie mit verschiedenen Inventardateien oder Gruppen arbeiten.

Wenn Sie zwei verschiedene Inventardateien haben, definieren Sie in einem die lokalen Hosts, in den anderen alle Remote-Hosts. Wenden Sie dann das gewünschte Inventar an, wenn Sie auf ansible, -i inv.d/local oder -i inv.d/remote, zugreifen.

Oder haben Sie alles in einem Inventar und übergeben Sie die Gruppe dynamisch. In Ihrem Inventar definieren Sie zwei Gruppen:

[local] 
127.0.0.1 

[remote] 
host-1 
host-2 
host-N 

Und dann die Gruppe als Extra-var ansible passieren: -e "run=local" oder -e "run=remote"

in Ihrem Textbuch legen Sie die hosts dynamisch:

--- 
- hosts: "{{ run | mandatory }}" 
    gather_facts: no 
    tasks: 
    ... 

In Ihrem Beispiel scheint es, dass Sie nur mit einem einzelnen Remote-Host arbeiten, der unter vhost extra-var definiert ist. In diesem Fall scheint es am besten zu sein, diese Variable im Abschnitt hosts zu verwenden und standardmäßig localhost zu verwenden.

--- 
- hosts: "{{ vhost | default('127.0.0.1') }}" 
    gather_facts: no 
    tasks: 
    ... 

Also, wenn vhost das ganze Textbuch definiert ist, wird auf dem Host ausgeführt werden. Wenn es nicht definiert ist, wird das Playbook lokal ausgeführt.

Schließlich könnte man noch die delegate_to Option auf einzelne Aufgaben wie so verwenden:

- name: Local AND remote command 
    command: hostname 
    delegate_to: "{{ '127.0.0.1' if vhost is undefined else omit }}" 

omit is a special variable machen ansible die Option ignorieren, als ob es nicht definiert wurde.

+0

Würde es funktionieren: 'Verbindung:" {{'ansible_host' | default ('local')}} "'? [Docs] (http://docs.ansible.com/ansible/intro_inventory.html#non-ssh-connection-types) scheinen mehrdeutig, "ansible_host" ist definiert als der Name des Docker-Containers, zu dem eine Verbindung hergestellt werden soll. Ich bin bereit, dass das nur ein Fehler in der Dokumentation ist. –

+0

Ich würde die Verbindung in der Inventar-Datei, wie am Ende dieses Abschnitts beschrieben: http://docs.ansible.com/ansible/intro_inventory.html#hosts-and-groups – udondan

+0

'localhost ansible_connection = local' – udondan

Verwandte Themen