Ik heb een Ansible-playbook voor het implementeren van een Java-app als een init.d-daemon.
Als beginner in zowel Ansible als Linux heb ik problemen om taken voorwaardelijk uit te voeren op een host op basis van de status van de host.
Ik heb namelijk een aantal hosts die de service al aanwezig hebben en draaien waar ik deze wil stoppen voordat ik iets anders ga doen. En dan zijn er misschien nieuwe hosts, die de service nog niet hebben. Ik kan dus niet zomaar service: name={{service_name}} state=stopped
gebruiken, omdat dit niet werkt op nieuwe hosts.
Hoe kan ik dit bereiken? Dit is wat ik tot nu toe heb:
- 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
Antwoord 1, autoriteit 100%
Bekijk de service_facts
module, nieuw in Ansible 2.5.
- name: Populate service facts
service_facts:
- debug:
msg: Docker installed!
when: "'docker' in services"
Antwoord 2, autoriteit 87%
Natuurlijk zou ik ook kunnen controleren of het wrapper-script bestaat in /etc/init.d. Dus dit is waar ik mee eindigde:
- name: Check if Service Exists
stat: path=/etc/init.d/{{service_name}}
register: service_status
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_status.stat.exists
register: service_stopped
Antwoord 3, autoriteit 19%
Ik heb Florian’s antwoordaangepast om alleen de retourcode van de opdracht service
te gebruiken (deze werkte aan Mint 18.2)
- name: Check if Logstash service exist
shell: service logstash status
register: logstash_status
failed_when: not(logstash_status.rc == 3 or logstash_status.rc == 0)
- name: Check if Logstash service exist
service:
name: logstash
state: stopped
when: logstash_status.rc == 0
Antwoord 4, autoriteit 17%
Het zou fijn zijn als de “service”-module “niet-herkende service”-fouten zou kunnen verwerken.
Dit is mijn benadering, waarbij ik de opdracht service
gebruik in plaats van te controleren op een init-script:
- name: check for apache
shell: "service apache2 status"
register: _svc_apache
failed_when: >
_svc_apache.rc != 0 and ("unrecognized service" not in _svc_apache.stderr)
- name: disable apache
service: name=apache2 state=stopped enabled=no
when: "_svc_apache.rc == 0"
- controleer de afsluitcode van “servicestatus” en accepteer de afsluitcode 0 wanneer de uitvoer “niet-herkende service” bevat
- als de afsluitcode 0 was, is die service geïnstalleerd (gestopt of actief)
Antwoord 5, autoriteit 6%
Een andere benadering voor systemd (van Jakuje):
- name: Check if cups-browsed service exists
command: systemctl cat cups-browsed
check_mode: no
register: cups_browsed_exists
changed_when: False
failed_when: cups_browsed_exists.rc not in [0, 1]
- name: Stop cups-browsed service
systemd:
name: cups-browsed
state: stopped
when: cups_browsed_exists.rc == 0
Antwoord 6
Op deze manier heeft het gebruik van alleen de servicemodule voor ons gewerkt:
- name: Disable *service_name*
service:
name: *service_name*
enabled: no
state: stopped
register: service_command_output
failed_when: >
service_command_output|failed
and 'unrecognized service' not in service_command_output.msg
and 'Could not find the requested service' not in service_command_output.msg
Antwoord 7
Mijn paar centen. Dezelfde aanpak als hierboven, maar voor kubernetes
Controleer of de kublete-service actief is
- name: "Obtain state of kublet service"
command: systemctl status kubelet.service
register: kubelet_status
failed_when: kubelet_status.rc > 3
Debug-bericht weergeven als de kublet-service niet actief is
- debug:
msg: "{{ kubelet_status.stdout }}"
when: "'running' not in kubelet_status.stdout"