
背景:
2 つの役割を持つプロジェクトがあります。
理解を深めるために、問題のあるタスクの数を減らしました。
問題:
server1 の role1 からタスクを実行し、最初の server1 ロール タスクの条件から VMware 仮想化ツールにタスクを委任しようとします。すると、server1 で 2 番目のロール タスク (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
2 番目のロールがサーバーではなく VMware 仮想化ツールで実行されるようにする方法を見つけようとしましたが、うまくいきませんでした
。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