从剧本中停止ansible(site.yml)

时间:2019-06-06 03:46:43

标签: ansible

按照@Zeitounator的建议,我将问题重写为更具体,而不是使用我要实现的目标的通用示例。

我通过在hosts.ini文件中添加新条目并运行ansible-playbook -i inventory/dev/hosts.ini --limit SomeGroup playbooks/site.yml

,使用ansible在VMware中启动VM。

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。但我宁愿使用变量而不是单独的剧本。如果有强烈的理由要以这种方式拆分剧本,请提供参考。

请让我知道是否需要进一步说明。

谢谢。

1 个答案:

答案 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