Contexto:
Tengo un proyecto con dos roles.
He reducido el número de tareas a las problemáticas para una mejor comprensión.
Problema:
ejecuto una tarea desde una función1 en el servidor1 e intento delegar una tarea a un virtualizador vmware desde la condición en la primera tarea de la función del servidor1. Y que un host falle porque quiere ejecutar la segunda tarea de rol (Vmware) en el servidor1.
El error:
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"}
Aquí está la estructura:
.
├── 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
Este es el orden de ejecución en caso de no encontrar un lun libre en el host:
resizefs_role_hosts.yml -> roles/resizefs/tasks/main.yml -> roles/resizefs/tasks/findfreedisk.yml -> \
roles/vmwaretaks/tasks/main.yml -> roles/vmwaretaks/tasks/addvmwaredisk.yml
Así es como se ven los libros de jugadas:
$ 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
Estaba tratando de encontrar la manera de decirle que el segundo rol no se ejecuta en el servidor sino en el virtualizador vmware, pero no tuve suerte.
Si ejecuto addvmwaredisk.yml como un libro de jugadas, funciona perfecto.
¡Espero que puedas ayudar!
¡gracias de antemano!
Respuesta1
hosts
y tasks
son palabras clave de juego, no se pueden utilizar dentro de una lista de tareas. Para ejecutar tareas en un host diferente al host de juego actual, usedelegación; Para agrupar tareas relacionadas y aplicar directivas a todas ellas, utilice unbloquear.
- 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'
Respuesta2
bueno, lo resolví recientemente simplemente agregandoconvertirse en: no
- delegate_to: localhost
become: no
delegate_facts: yes