2017-02-20 11 views
0

Ich versuche eine EBS-Rolle für meine Ansible-Skripte zu erstellen. Ich werde das EBS-Volume erstellen und es jetzt selbst über die Konsole anhängen. Ich möchte, dass diese Rolle Befehle ausführt und das Laufwerk mountet, wenn das Laufwerk noch nicht gemountet ist. Überspringe es jedoch, wenn es bereits gemountet ist.Ansible - Überprüfen, ob Drive Mounted ist

ich bestimmte Vars haben hosten, die eine Liste der Festplatten geben und Bereitstellungspunkte:

ebs_vols: 
    - drive: /dev/sdb 
    mount_point: /mnt/ebs1 
    directory: /var/lib/mysql 
    - drive: /dev/sdc 
    mount_point: /mnt/ebs2 
    directory: /var/backups 

Ich möchte meine Aufgabe jedes Laufwerk überprüfen Sie mit einem df Befehl haben, und sehen, ob es angebracht ist. Dann Befehle überspringen, wenn der Antrieb montiert ist:

- name: Check if drives are already mounted 
    shell: df | grep "{{item.drive}}" | wc -l 
    with_items: "{{ebs_vols}}" 
    register: ebs_checked 

- name: output debug 
    debug: var=ebs_checked 

- name: Make filesystem 
    filesystem: 
    fstype: xfs 
    dev: "{{item.item.drive}}" 
    when: "{{item.stdout}} == 0" 
    with_items: ebs_checked.results 

Wenn ich es laufen, so scheint es, jede Scheibe ganz gut zu überprüfen, weil der Ausgang der debug ist ein Objekt mit den richtigen Laufwerken und stdout. Das Problem ist mit der Aufgabe Make filesystem. Die Fehler aus mit dem folgenden Fehler:

The conditional check '{{item.stdout}} == 0' failed. The error was: error while evaluating conditional ({{item.stdout}} == 0): 'ansible.vars.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'stdout'\n\n

Was bin ich hier und was ist der beste Weg, Befehle zu überspringen, wenn der Antrieb bereits montiert ist?

Antwort

3

In Ansible können Sie keine "blanken Variablen" mehr verwenden. Die folgende Zeile führt ansible den ebs_checked.results Wert als String zu interpretieren:

with_items: ebs_checked.results 

Verwenden Sie die richtige Syntax statt:

with_items: "{{ ebs_checked.results }}" 
+0

Ah, ich verstehe. Anfängerfehler. Ich bin neu bei Ansible und ich vermute, dass ich eine Art von Syntaxfehler erwartet habe, anstatt es tatsächlich auszuführen. Vielen Dank! – gkrizek

+0

Es gibt keinen Syntaxfehler. 'item' ist ein String-Wert von' ebs_checked.results' zugeordnet und es ist ein Fehler aufgetreten, dass er den 'stdout'-Schlüssel nicht enthält, den Sie zu verwenden versucht haben. – techraf

+0

Diese Verwendung von blanken Variablen in 'with_' -Schleifen wurde in Ansible 2.0 veraltet und in 2.2 entfernt - siehe [Leitfaden zur Portierung von Ansible 2.0] (https://docs.ansible.com/ansible/porting_guide_2.0.html#deprecated)). – RichVel

0

Möchten Sie folgendes versuchen:

- name: Check if drives are already mounted 
    command: '/bin/mountpoint -q {{item.directory}}' 
    with_items: '{{ebs_vols}}' 
    register: ebs_checked 
    changed_when: "ebs_checked.rc != 0" 

Auch ansible des Setup-Modul füllt ein ansible_mounts Array, aber ich hatte keine Chance zu sehen, ob es in diesem Zusammenhang hilfreich wäre.

Verwandte Themen