
상황:
저는 두 가지 역할을 가진 프로젝트를 가지고 있습니다.
더 나은 이해를 위해 작업 수를 문제 작업으로 줄였습니다.
문제:
server1의 role1에서 작업을 실행하고 첫 번째 server1 역할 작업의 조건에서 vmware virtualizer에 작업을 위임하려고 합니다. 그리고 server1에서 두 번째 역할 작업(Vmware)을 실행하려고 하기 때문에 호스트가 실패하게 됩니다.
오류:
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"}
구조는 다음과 같습니다.
.
├── 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
호스트에서 사용 가능한 LUN을 찾지 못한 경우 실행 순서는 다음과 같습니다.
resizefs_role_hosts.yml -> roles/resizefs/tasks/main.yml -> roles/resizefs/tasks/findfreedisk.yml -> \
roles/vmwaretaks/tasks/main.yml -> roles/vmwaretaks/tasks/addvmwaredisk.yml
플레이북은 다음과 같습니다.
$ 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
나는 두 번째 역할이 서버가 아닌 vmware virtualizer에서 실행되지만 운이 좋지 않다는 것을 알려주는 방법을 찾으려고 노력했습니다.
addvmwaredisk.yml을 플레이북으로 실행하면 완벽하게 실행됩니다.
도움이 되셨으면 좋겠습니다!
미리 감사드립니다!
답변1
hosts
플레이 키워드 이므로 tasks
작업 목록 내에서 사용할 수 없습니다. 현재 플레이 호스트가 아닌 다른 호스트에서 작업을 실행하려면 다음을 사용하세요.대표단; 관련된 작업을 그룹화하고 모든 작업에 지시문을 적용하려면차단하다.
- 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'
답변2
음, 최근에 문제를 해결했습니다.되다: 아니
- delegate_to: localhost
become: no
delegate_facts: yes