我有一个用于部署Java应用程序作为init.d守护程序的Ansible playbook。
作为Ansible和Linux的初学者,我在主机状态基础上条件性地执行任务遇到了问题。
具体而言,我有一些已经存在并运行服务的主机,我想在执行其他任何操作之前停止它。然后可能会有新主机,它们还没有该服务。因此,我不能简单地使用service: name = {{service_name}} state = stopped
,因为这将在新主机上失败。
我该如何实现这一点?以下是我目前拥有的内容:
- name: Check if Service Exists
shell: "if chkconfig --list | grep -q my_service; then echo true; else echo false; fi;"
register: service_exists
# This should only execute on hosts where the service is present
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_exists
register: service_stopped
# This too
- name: Remove Old App Folder
command: rm -rf {{app_target_folder}}
when: service_exists
# This should be executed on all hosts, but only after the service has stopped, if it was present
- name: Unpack App Archive
unarchive: src=../target/{{app_tar_name}} dest=/opt
telnet.socket
服务而言是如此,它在ansible_facts.services
中显示为telnet@0.service
。 - StockBwhen: "'docker' in services"
时会失败,因为收集到的事实是使用完整名称(docker.service
)而不是docker
进行索引。可能与平台有关,但至少在CentOS上,这些事实只使用完整名称。 - jsowhen: ansible_facts.services ['service-name.service'] is defined
。 - Ian Gibbswhen: "ansible_facts.services is defined and 'docker' in ansible_facts.services"
- dom