有什么办法可以一直扮演角色吗?我在开始任何部署之前创建锁定文件以防止并行部署。如果出现任何失败/成功,我想删除锁定文件。
- { role: lock-deployment, tags: always }
- { role: fetch-artifactory, tags: always }
- { role: unlock-deployment, tags: always }
无论失败/成功,我都想运行解锁部署角色。
有什么办法可以一直扮演角色吗?我在开始任何部署之前创建锁定文件以防止并行部署。如果出现任何失败/成功,我想删除锁定文件。
- { role: lock-deployment, tags: always }
- { role: fetch-artifactory, tags: always }
- { role: unlock-deployment, tags: always }
无论失败/成功,我都想运行解锁部署角色。
问题是我不想为每项任务做阻塞,救援。我只想在任何任务失败的情况下删除锁定文件。如果可以将角色本身放入块中,我尝试环顾四周,但没有找到。参考
您可以使用block
withalways
构造。角色可以包含在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]
您可以使用 Ansible块并始终用于这种情况
http://docs.ansible.com/ansible/latest/playbooks_blocks.html
如何使用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
而是去做。
另外:我还没有测试过这个解决方案,实际上可能无法正常工作。但它为替代解决方案提供了一个想法。