Instruir para executar uma unidade depois de completar outra unidade com sucesso

4

Eu uso o cloud-config para instalar e configurar o cluster DCOS.

Normalmente, o agentinstall.service service leva 5 minutos para ser concluído.

É possível instruir ao systemd para executar agentconfigure.service somente após agentinstall.service concluído?

#cloud-config
coreos:
  units:
    - name: "agentinstall.service"
      command: "start"
      content: |
        [Unit]
        Description=agent_setup
        After=network.target

        [Service]
        Type=simple
        User=root
        WorkingDirectory=/tmp
        ExecStartPre=/bin/curl -o /tmp/dcos_install.sh  http://bootstapnode-0.dev.myztro.internal:9090/dcos_install.sh
        ExecStartPre=/bin/chmod 755 dcos_install.sh
        ExecStart=/bin/bash dcos_install.sh slave

        [Install]
        WantedBy=multi-user.target
    - name: "agentconfigure.service"
      command: "start"
      content: |
        [Unit]
        Description=agent_config
        After=agentinstall.service

        [Service]
        Type=simple
        User=root
        WorkingDirectory=/opt/mesosphere/etc/
        ExecStartPre=/bin/echo "MESOS_ATTRIBUTES=cluster:uploader" >> /opt/mesosphere/etc/mesos-slave-common
        ExecStartPre=/bin/rm -f /var/lib/mesos/slave/meta/slaves/latest
        ExecStart=/usr/bin/systemctl restart dcos-mesos-slave

        [Install]
        WantedBy=multi-user.target

Obrigado.

    
por UtpMahesh 02.10.2017 / 09:30

2 respostas

3

Eu não estou ciente de uma maneira de fazer isso com o systemd, pois acho que ele está preocupado apenas com o início e o funcionamento das unidades. Como em, você pode usar After= para forçar uma unidade a iniciar somente APÓS ter iniciado o especificado ou ambos iniciarem em paralelo.

Wants= fará com que as unidades especificadas sejam iniciadas em paralelo (se as unidades desejadas ainda não estiverem iniciadas / ativas), não o que você deseja.

Requires= , se usado em conjunto com After= on agentconfigure.service , garante que agentconfigure.service seja iniciado DEPOIS agentinstall.service está ativo ("ocupado"). Agora, você pode ter um loop em agentconfigure.service que espera, digamos no máximo 5 minutos, e verificar regularmente se há agentinstall.service para concluir antes de prosseguir com o trabalho real. A única opção que vejo para isso.

EDIT: Outra opção que acho melhor ainda ... agentinstall.service inicia agentconfigure.service quando a instalação é bem-sucedida e, em seguida, sai.

    
por 02.10.2017 / 15:55
1

Você deseja executar após o comando /bin/bash dcos_install.sh slave ?

Altere o serviço com esse comando para Type=oneshot . Além disso, eu não acho que você precise usar ExecStartPre =, apenas use ExecStart = para tudo.

@JdeBP me pede para salientar que seu comando echo está tentando usar o redirecionamento de shell que não funcionarão .

    
por 03.10.2017 / 19:07