5

有什么办法可以一直扮演角色吗?我在开始任何部署之前创建锁定文件以防止并行部署。如果出现任何失败/成功,我想删除锁定文件。

- { role: lock-deployment, tags: always }
- { role: fetch-artifactory, tags: always }
- { role: unlock-deployment, tags: always }

无论失败/成功,我都想运行解锁部署角色。

4

3 回答 3

5

问题是我不想为每项任务做阻塞,救援。我只想在任何任务失败的情况下删除锁定文件。如果可以将角色本身放入块中,我尝试环顾四周,但没有找到。参考

可以使用blockwithalways构造。角色可以包含在include_role

tasks:
  - include_role:
      name: lock-deployment
  - block:
    - include_role:
        name: fetch-artifactory
    always:
      - include_role:
          name: unlock-deployment

这会产生您想要的流程(fetch-artifactory包含fail模拟失败的任务):

PLAY [localhost] ***************************************************************************************

TASK [include_role] ************************************************************************************

TASK [lock-deployment : file] **************************************************************************
changed: [localhost]

TASK [include_role] ************************************************************************************

TASK [fetch-artifactory : fail] ************************************************************************
Unaltered: {'msg': u'Failed as requested from task', 'failed': True, 'changed': False}
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Failed as requested from task"}

TASK [include_role] ************************************************************************************

TASK [unlock-deployment : file] **********************************************************************
changed: [localhost]
于 2017-12-01T13:04:54.377 回答
0

您可以使用 Ansible始终用于这种情况

http://docs.ansible.com/ansible/latest/playbooks_blocks.html

于 2017-11-30T14:39:04.670 回答
0

如何使用block并包含来自角色的 yaml 文件,而不是将角色声明为依赖项:

tasks:
  - name: "start deployment"
    block:
      - include: "<path to roles>/lock-deployment/tasks/main.yaml"
      - include: "<path to roles>/fetch-artifactory/tasks/main.yaml"
      - include: "<path to roles>/unlock-deployment/tasks/main.yaml"
    always:
      - name: "remove lock file"
        ...

如果您需要包含您的default变量,您roles可以这样做:

roles:
  - { role: lock-deployment,
      when: False
    }

我的解决方案不是一个优雅的解决方案,但我真的建议roles不要采取这些行动,includes而是去做。

另外:我还没有测试过这个解决方案,实际上可能无法正常工作。但它为替代解决方案提供了一个想法。

于 2017-11-30T16:48:47.487 回答