Usando a instrução if / else para executar um comando no shell

2

Eu queria executar um comando no shell (basicamente via playbook ansible), a condição é, se o status do ps dá código de saída não zero, então ele precisa executar outro comando. Eu não queria dividir isso em duas tarefas, uma para verificar o status do ps e outra para executar o comando. Em vez de usar a condição if / else, isso pode ser mesclado em uma única tarefa?

ps -ef | grep -v grep | grep httpd

Se o comando acima sair com status diferente de zero, eu preciso disparar outro comando que é dado abaixo. Como posso mesclar esses dois comandos como um e incluí-lo como uma única tarefa?

nohup /root/scripts/httpd.sh start &
    
por Gokulnath Kumar 22.06.2018 / 22:42

1 resposta

1

Solução

Isso faz o que você quer:

  tasks:
    - name: pser
      shell: ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &

OBSERVAÇÃO: estou usando o comando sleep 1000 como um substituto para o seu processo de daemon do Apache, httpd .

Exemplo de execução

$ cat pb.yml
- name: Hello Ansible - quick start
  hosts: all
  connection: local

  tasks:
    - name: pser
      shell: ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &

Observe que não temos um processo de suspensão ou httpd presente:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
$

Agora executamos o manual:

$ ansible-playbook -i inventory pb.yml

PLAY [Hello Ansible - quick start] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [pser] ************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

Agora temos um processo de suspensão:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34422     1   0  2:00AM ttys000    0:00.00 /bin/bash -c ps -ef | grep [h]ttpd && echo found || nohup sleep 1000 &
  501 34425 34422   0  2:00AM ttys000    0:00.00 sleep 1000

Agora, se redefinirmos as coisas e fizermos a mesma coisa, desta vez, abra uma janela de edição com um nome de arquivo de httpd para "falsificar" a grep [h]ttpd :

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34542     1   0  2:02AM ??         0:00.27 /usr/local/Cellar/macvim/HEAD-4e631a0/MacVim.app/Contents/bin/../MacOS/Vim -f -g httpd

Executar o playbook desta vez não fará nada:

$ ansible-playbook -i inventory pb.yml

PLAY [Hello Ansible - quick start] *************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [pser] ************************************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

Ainda é apenas a nossa janela de edição com o arquivo 'httpd' aberto:

$ ps -eaf|grep -E "[s]leep|[h]ttpd"
  501 34542     1   0  2:02AM ??         0:00.27 /usr/local/Cellar/macvim/HEAD-4e631a0/MacVim.app/Contents/bin/../MacOS/Vim -f -g httpd
    
por 23.06.2018 / 08:04