
Kontext:
Ich habe ein Projekt mit zwei Rollen.
Zum besseren Verständnis habe ich die Anzahl der Aufgaben auf die Problemaufgaben reduziert.
Problem:
Ich führe eine Aufgabe von einer Rolle1 auf Server1 aus und versuche, eine Aufgabe aus der Bedingung in der ersten Rollenaufgabe auf Server1 an einen VMware-Virtualisierer zu delegieren. Und ein Host schlägt fehl, weil er die zweite Rollenaufgabe (Vmware) auf Server1 ausführen möchte.
Der Fehler:
fatal: [testhost]: FAILED! => {"reason": "conflicting action statements: hosts,
gather_facts\n\nThe error appears to be in '/home/ancible/proyects/extend_fs-role/roles/vmwaretaks/tasks/addvmwaredisk.yml': line 2, column 3,
but may\nbe elsewhere in the file depending on tntax problem.\n\nThe offending line appears to be:\n\n---\n- hosts: localhost\n ^ here\n"}
Hier ist die Struktur:
.
├── collections
│ └── requirements.yml
├── README.md
├── resizefs_hosts.yml
└── roles
├── resizefs
│ ├── defaults
│ │ └── main.yml
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── tasks
│ │ ├── main.yml
│ │ ├── findfreedisk.yml
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── vmwaretaks
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ ├── main.yml
│ ├── addvmwaredisk.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
Dies ist die Ausführungsreihenfolge, falls im Host kein freier LUN gefunden wird:
resizefs_role_hosts.yml -> roles/resizefs/tasks/main.yml -> roles/resizefs/tasks/findfreedisk.yml -> \
roles/vmwaretaks/tasks/main.yml -> roles/vmwaretaks/tasks/addvmwaredisk.yml
So sehen die Playbooks aus:
$ cat resizefs_role_hosts.yml
---
- hosts: testhost
become: yes
become_method: sudo
roles:
- role: 'roles/resizefs'
$ cat roles/resizefs/tasks/main.yml
---
# tasks file for create_fs-test
- import_tasks: findfreedisk.yml
$ cat roles/resizefs/tasks/findfreedisk.yml
- name: Finding disk with no partitions
set_fact:
disks: "/dev/{{outer_item.key}}"
when:
- not outer_item.value.partitions
- not outer_item.value.links.ids
- outer_item.key is search ("sd")
with_dict: '{{ansible_devices}}'
loop_control:
loop_var: outer_item
notify:
- Format_free_disk
changed_when: true
- name: Print disk name if available
debug:
msg:
- "{{ disks|default('NOT FREE DISK') }} Available"
# If not disk available add new lun from Vmware
- include_role:
name: vmwaretaks
when: disks is undefined
$ cat roles/vmwaretaks/tasks/main.yml
---
# tasks file for add-new-vmware-lun
- import_tasks: addvmwaredisk.yml
$ cat roles/vmwaretaks/tasks/addvmwaredisk.yml
---
- hosts: localhost
gather_facts: true
vars:
vcenter_hostname: 'vcenter.labo.local'
vcenter_username: 'labo.local\ansible'
vcenter_password: "{{ vault_pass }}"
target_host: 'TESTHOST'
vm_uuid: '4217B33E-014D-E056-0719-45AD3AC1861E'
vm_unit_number: '5'
tasks:
- name: Add disks to virtual machine using UUID
vmware_guest_disk:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ vcenter_hostname }}"
uuid: "{{ vm_uuid | lower }}"
validate_certs: no
disk:
- size_gb: 10
type: 'thick'
state: 'present'
autoselect_datastore: yes
scsi_controller: '0'
scsi_type: 'paravirtual'
unit_number: '5'
disk_mode: 'independent_persistent'
delegate_to: localhost
Ich habe versucht, einen Weg zu finden, um ihm mitzuteilen, dass die zweite Rolle nicht auf dem Server, sondern im VMware-Virtualisierer ausgeführt wird, aber ohne Erfolg.
Wenn ich addvmwaredisk.yml als Playbook ausführe, läuft es perfekt
. Ich hoffe, Sie können helfen!
Vielen Dank im Voraus!
Antwort1
hosts
und tasks
sind Play-Schlüsselwörter, sie können nicht innerhalb einer Aufgabenliste verwendet werden. Um Aufgaben auf einem anderen Host als dem aktuellen Play-Host auszuführen, verwenden SieDelegation; um verwandte Aufgaben zu gruppieren und Anweisungen auf alle anzuwenden, verwenden Sie einBlock.
- delegate_to: localhost
vars:
vcenter_hostname: 'vcenter.labo.local'
vcenter_username: 'labo.local\ansible'
vcenter_password: "{{ vault_pass }}"
target_host: 'TESTHOST'
vm_uuid: '4217B33E-014D-E056-0719-45AD3AC1861E'
vm_unit_number: '5'
block:
- name: Add disks to virtual machine using UUID
vmware_guest_disk:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ vcenter_hostname }}"
uuid: "{{ vm_uuid | lower }}"
validate_certs: no
disk:
- size_gb: 10
type: 'thick'
state: 'present'
autoselect_datastore: yes
scsi_controller: '0'
scsi_type: 'paravirtual'
unit_number: '5'
disk_mode: 'independent_persistent'
Antwort2
nun, ich habe es vor kurzem gelöst, indem ich einfach hinzufügewerden: nein
- delegate_to: localhost
become: no
delegate_facts: yes