Ansible позволяет достаточно просто обеспечить выполнение процесса на каждом хосте.
Я мог бы сделать что-то вроде:
---
- hosts: app_cluster
tasks:
- name: Look for the "foo" process
shell: ps -ef | grep foo | grep -v grep
register: process_list
changed_when: false
- name: Start "foo" if needed
shell: nohup /bin/foo &
when: "process_list.stdout.find('foo') == -1"
Однако мне нужен только один экземпляр определенного процесса в кластере. Т.е. он может работать на любом хосте, пока он работает где-то и пока существует только один такой процесс везде в кластере.
Может быть, есть удобный способ сделать это в анзибле?
Вы можете использовать run_once
параметр, как описано в http://docs.ansible.com/ansible/playbooks_delegation.html#run-once поэтому задача будет выполняться только на первом узле пакета. Учтите, что вы не можете указать порядок, но он каким-то образом "предсказуем" (подробнее в https://github.com/ansible/ansible/issues/10964 )