按照@Zeitounator的建议,我将问题重写为更具体,而不是使用我要实现的目标的通用示例。
我通过在hosts.ini
文件中添加新条目并运行ansible-playbook -i inventory/dev/hosts.ini --limit SomeGroup playbooks/site.yml
vmware角色(称为vmware
)将
*检查虚拟机是否已经存在。
*如果这样做,则显然不会创建VM。
*如果不存在,则会从模板创建VM。
要销毁VM,请运行以下命令:ansible-playbook -i inventory/dev/hosts.ini --limit SomeGroup playbooks/site.yml -e 'vmware_destroy=true'
可以正常工作。现在是我的问题。
设置此变量(vmware_destroy=true
)后,它将成功销毁VM,但ansible将尝试在刚销毁的主机上继续处理剩余的剧本。显然,它失败了。实际上,由于故障,剧本确实停止了。但不能优雅。
这是逻辑流程的一个示例:
$ cat playbooks/site.yml
---
- hosts: all
gather_facts: no
roles:
- { role: vmware, tags: vmware }
- hosts: all
gather_facts: yes
roles:
- { role: bootstrap, tags: bootstrap }
- { role: common, tags: common }
- hosts: AppServers
gather_facts: no
roles:
- { role: application }
# and so on.
$ cat playbooks/roles/vmware/main.yml
---
# Checks to see if the VM exists already.
# A variable `found_vm` is registered in this task.
- import_tasks: find.yml
# Only import this task when all of the `when` conditions are met.
- import_tasks: destroy.yml
when:
- vmware_destroy is defined
- vmware_destroy # Meaning 'True'
- found_vm
# If the above is true, it will not import this task.
- import_tasks: create.yml
when:
- found_vm.failed
- vmware_destroy is not defined
因此,关键是,当我指定-e 'vmware_destroy=true'
时,ansible将尝试运行其余的剧本而失败。
我不想ansible失败。我希望它在完成基于命令行上提供的vmware
标志的-e 'vmware_destroy=true
角色后正常停止。
我知道我可以为此使用其他剧本,例如:
ansible-playbook -i inventory/dev/hosts.ini --limit SomeGroup playbooks/VMWARE_DESTROY.yml
。但我宁愿使用变量而不是单独的剧本。如果有强烈的理由要以这种方式拆分剧本,请提供参考。
请让我知道是否需要进一步说明。
谢谢。
答案 0 :(得分:0)
剧本是Ansible最顶层的抽象层(剧本->角色->任务-> ...)。 AWX中还有另外2个层(工作流->作业模板->剧本...)来控制剧本。要遵循该架构,应使用AWX或任何其他与Ansible接口的工具(例如ansible-runner或脚本)来控制剧本。
在Ansible内部控制剧本非常笨拙。创建2本剧本 vmware-create.yml 和 vmware-destroy.yml
$ cat vmware-create.yml
- hosts: all
gather_facts: yes # include cached variables
tasks:
- block:
- debug:
msg: Don't create VM this time. End of play.
- meta: end_play
when: not hostvars['localhost'].vmware_create
- debug:
msg: Create VM.
$ cat vmware-destroy.yml
- hosts: all
gather_facts: yes # include cached variables
tasks:
- block:
- debug:
msg: Don't destroy VM this time. End of play.
- meta: end_play
when: not hostvars['localhost'].vmware_destroy
- debug:
msg: Destroy VM.
并将其导入到剧本 vmware_control.yml 中。见下文
$ cat vmware-control.yml
- hosts: localhost
vars:
vmware_create: true
vmware_destroy: false
tasks:
- set_fact:
vmware_create: "{{ vmware_create }}" # cache variable
- set_fact:
vmware_destroy: "{{ vmware_destroy }}" # cache variable
- import_playbook: vmware-create.yml
- import_playbook: vmware-destroy.yml
使用变量 vmware_create 和 vmware_destroy 控制流。在 localhost 上运行 vmware_control.yml ,并在 vmware-create.yml 和 vmware中声明 hosts:all -destroy.yml 。