作为 Ansible 安装过程的一部分,我们需要将一些 ISO、OVA 文件或模板文件导入到数据存储中,以便我们可以在安装过程中使用它们。我们已经有一个用于 API 访问的现有令牌,因此我们希望使用该身份验证来上移文件。为了避免依赖性,我们仅使用 Ansible URI 调用 vCenter API,并希望我们可以继续该方法。
我们看到 govc 和 PowerCli 能够在何处将文件上传到数据存储,并且我们看到 GUI 可以通过 vCenter 上传 OVA 和其他文件,而无需 root 身份验证,但我们无法找到可用于上传的 API 调用我们需要的文件。现在我们可以使用 ssh 或 govc 来做到这一点,但我们试图避免多种身份验证方法(例如 ssh / root 访问主机),并希望尽可能限制对其他工具的依赖。这可以通过 API 来完成吗?我看到参考文献说 SOAP 可能是执行此操作的方法,但我没有看到任何示例。
到目前为止我们已经尝试过:
- name: Upload File
uri:
url: "https://{{ vcenter_hostname }}/folder/{{ upload_datastore }}/Some-test-file.iso"
method: PUT
src: ISOs/debian/11/debian-11.9.0-amd64-DVD-1.iso
force_basic_auth: yes
validate_certs: no
headers:
Cookie: "{{ auth_cookie.set_cookie }}"
我们还尝试使用在身份验证过程中从 vCenter 获得的相同令牌写入 ESXi 主机
- name: Upload File
uri:
url: "https://{{ esxi_hostname }}/folder/{{ upload_datastore }}/Some-test-file.iso"
method: PUT
src: ISOs/debian/11/debian-11.9.0-amd64-DVD-1.iso
force_basic_auth: yes
validate_certs: no
headers:
Cookie: "{{ auth_cookie.set_cookie }}"
目标是在数据存储中创建 ISO。我只需要了解 API 调用即可。我知道其他工具可以做到这一点,但这个问题具体是关于调用 vCenter 服务器来完成此操作。
我能够解决这个问题。几个要点:
这应该是一个有效的示例:
- name: Transfer a File
hosts: localhost
gather_facts: false
vars:
vcenter_hostname: "your.vcenter.local"
vcenter_user: "[email protected]"
src_file_path: "./testfile.txt"
dst_file_name: "SomeNewFileName.txt"
dst_folder_name: "AnExistingFolder"
datastore_name: "TheNameOfTheDatastore"
datacenter_name: "TheNameOfTheDatacenterInVCenter"
tasks:
- name: Transfer a File Test
uri:
url: "https://{{ vcenter_hostname }}/folder/{{ dst_folder_name }}/{{ dst_file_name }}?dsName={{ datastore_name }}&dcPath={{ datacenter_name }}"
force_basic_auth: yes
validate_certs: no
user: "{{ vcenter_user }}"
password: "{{ lookup('ansible.builtin.env', 'ANSIBLE_PASSWORD') }}"
method: PUT
src: "{{ src_file_path }}"