我对 Ansible 还不熟悉,所以我可能配置错了
[我有一个运行 Ansible 服务的 Docker 容器,
我有一个包含 Ansible 文件的 Ansible 存储库(这是一个 .Git 存储库]
我的意愿是自动将 vCenter 服务器中的每个实验室恢复到特定快照
因此,我(在ansible-roles-explained-with-examples 指南):
ansible-galaxy init
创建了一个具有命令名称的角色vcenter
(参见下面的目录树)- 在文件夹中创建了一些 vcenter 任务文件(参见下面的目录树)。以下是任务文件
tasks
的示例:poweroff.yml
- name: Set the state of a virtual machine to poweroff
community.vmware.vmware_guest_powerstate:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
folder: "/{{ datacenter_name }}/{{ folder }}"
# name: "{{ guest_name }}"
name: "{{ ansible_hostname }}"
validate_certs: no
state: powered-off
delegate_to: localhost
register: deploy
- 在文件中提供的 vCenter 凭据
vcenter\vars\main.yml
,如下所示:
# vars file for vcenter
vcenter_hostname: vcenter.foo.com
vcenter_username: [email protected]
vcenter_password: f#0$o#1$0o
datacenter_name: FOO_Fighters
# datastore_name:
cluster_name: FOO
folder: '/FOO/PRODUCT/DOMAIN.COM/'
- 将任务包含在
tasks\main.yml
带有密钥的文件中import-task
,如下所示:
---
# tasks file for roles/vcenter
- import_tasks: poweroff.yml
# - import_tasks: poweron.yml
# - import_tasks: revert.yml
# - import_tasks: shutdown.yml
- 在库存库中创建了一个
all.yml
内部 group_vars 文件夹(我不知道这是否是一种专业的方法),其中包括所有 winrm 详细信息,如下所示:
---
#WinRM Protocol Details
ansible_user: DOMAIN\user
ansible_password: f#0$o#1$0o
ansible_connection: winrm
ansible_port: 5985
ansible_winrm_scheme: http
ansible_winrm_server_cert_validation: ignore
ansible_winrm_transport: ntlm
ansible_winrm_read_timeout_sec: 60
ansible_winrm_operation_timeout_sec: 58
- 创建了一个
revert_lab.yml
包含角色的剧本,如下所示
---
- name: revert an onpremis lab
hosts: all
roles:
- vcenter
我的ansible.cfg
是这样的:
[defaults]
inventory = /ansible/inventories
roles_path = ./roles:..~/ansible/roles
我执行了剧本来恢复实验室里的所有机器:
ansible-playbook playbooks/revert_vcenter_lab.yml -i inventories/test/onpremis/domain.com/lab_r.yml
我得到的错误是:
TASK [Gathering Facts] ****************************************************************************************************************************************************
[WARNING]: Error when collecting winrm facts: You cannot call a method on a null-valued expression. At line:15 char:17 + ...
$ansibleFacts.ansible_win_rm_certificate_expires = $_.Not ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo :
InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull at <ScriptBlock>, <No file>: line 15 at <ScriptBlock>, <No file>: line
13
ok: [vm1.domain.com]
ok: [vm2.domain.com]
ok: [vm3.domain.com]
ok: [vm4.domain.com]
ok: [vm5.domain.com]
ok: [vm6.domain.com]
ok: [vm7.domain.com]
ok: [vm8.domain.com]
TASK [vcenter : Set the state of a virtual machine to poweroff] ***********************************************************************************************************
fatal: [vm1.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM1'"}
fatal: [vm2.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM2'"}
fatal: [vm3.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM3'"}
fatal: [vm4.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM4'"}
fatal: [vm5.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM5'"}
fatal: [vm6.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM6'"}
fatal: [vm7.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM7'"}
fatal: [vm8.domain.com -> localhost]: FAILED! => {"changed": false, "msg": "Unable to set power state for non-existing virtual machine : 'VM8'"}
PLAY RECAP ****************************************************************************************************************************************************************
vm1.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm2.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm3.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm4.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm5.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm6.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm7.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
vm8.domain.com : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
A)我该如何消除Error when collecting winrm facts
错误?(看起来 playbook 无法识别all.yml
带有 win 的文件,但是为什么呢?)
b)如何修复错误“无法为不存在的虚拟机设置电源状态...”?(我们可以看到剧本通过 lab_r.yml 文件(来自库存库)中提到的 fqdns 访问机器,但错误与 vCenter 平台中显示的机器名称有关……)
我的存储库:
C:.
├───ansible
│ │ ansible.cfg
│ ├───inventories
│ │ └───test
│ │ ├───cloud
│ │ └───onpremis
│ │ └───domain.com
│ │ │ lab_j.yml
│ │ │ lab_r.yml
│ │ └───group_vars
│ │ all.yml
│ ├───playbooks
│ │ revert_lab.yml
│ └───roles
│ └───vcenter
│ ├───tasks
│ │ main.yml
│ │ poweroff.yml
│ │ poweron.yml
│ │ revert.yml
│ │ shutdown.yml
│ └───vars
│ main.yml
我的库存 lab_r.yml
- 这是部分架构
---
all:
children:
root:
children:
center:
children:
appservers:
hosts:
vm1.domain.com:
qservers:
hosts:
vm2.domain.com:
dbservers:
hosts:
vm3.domain.com:
答案1
从文档中看不太明显,但是/vm/
您的文件夹路径中缺少字符串。
- name: Set the state of a virtual machine to poweroff
community.vmware.vmware_guest_powerstate:
folder: "/{{ datacenter_name }}/vm/{{ folder }}"
name: "{{ ansible_hostname }}"
我猜想需要区分数据中心、数据存储、主机等中的其他资源。