Resolvido: Outra opção disponível para verificação telnet de portas abertas?

15

Eu sou novo no Ansible. Aqui está a minha tarefa ...

Tenho mais de 400 hosts e preciso verificar se 5 portas diferentes estão abertas desde o final até o servidor da web.

Individualmente, eu poderia efetuar login e executar:

telnet mywebserver.com 443
telnet mywebserver.com 80
telnet mywebserver.com 8443

..e assim por diante..

Qual módulo ou plug-in poderia ser usado no Ansible para que eu pudesse automatizar isso e que ele relate os resultados (portas abertas ou fechadas) de volta ao meu servidor Ansible?

AWhitaker
fonte

Respostas:

28

Você pode usar o módulo wait_for do Ansible , que verifica se uma porta TCP específica está aberta.

Como neste caso, todas as portas já devem estar abertas, podemos usar um número mínimo. tentativas, apenas o suficiente para cobrir problemas de rede:

- name: Check all port numbers are accessible from current host
  wait_for:
    host: mywebserver.com
    port: "{{ item }}"
    state: started         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
  ignore_errors: yes
  with_items:
    - 443
    - 80
    - 80443

Por padrão, o Ansible verifica uma vez a cada segundo (configurável no Ansible 2.3 usando o sleepatributo), portanto, isso verifica 3 vezes por porta.

Execute isso em um manual com seu inventário de mais de 400 hosts - o Ansible verificará em paralelo que todos os hosts podem acessar mywebserver.comnessas portas.

Usamos ignore_errors: yesaqui para que quaisquer erros sejam marcados em vermelho, mas não parem a execução.

Portas abertas são relatadas como okitens na saída e portas fechadas são relatadas como failed(você deve usar o -vvsinalizador ansible-playbookpara ver esta saída).

Saída de ajuste fino

Se você deseja uma saída mais específica para os casos de sucesso e falha, o código deve ser mais complexo, adicionando uma segunda tarefa:

  • wait_fortarefa deve registeruma variável
  • a segunda tarefa produz saída usando com debugbase na condição de sucesso / falha (por exemplo, usando a expressão condicional Jinja2 )
  • é necessário colocar essas duas tarefas em um arquivo de inclusão (sem nenhum with_itemsloop) e escrever uma tarefa principal do manual que use um include... with_itemspara chamar o arquivo de inclusão uma vez por porta.
RichVel
fonte
É importante que eles precisem definir host: mywebserver.com.
Boicote SE para Monica Cellio
@XiongChiamiov - host: xnão é necessário. Acabei de testar novamente com o Ansible 2.3.1 e o hostatributo de wait_fortarefas é padronizado para o servidor atual sendo processado a partir do inventário.
RichVel
Exatamente, é por isso que o OP precisa substituí-lo: eles estão testando a conectividade com outro servidor da web de todos os seus servidores (releia a pergunta).
Boicote SE para Monica Cellio
2
Bom ponto, atualizei a resposta com o hostsatributo
RichVel 7/17/17
Obrigado! Isso funciona para mim e me dá o suficiente para trabalhar.
AWhitaker
2

AFAIK, não há módulo interno para esse fim, mas você pode usar shell+ nc:

---
- hosts: all
  tasks:
    - shell: nc -z -w 1 -G 1 my.hostname.com {{ item }} || echo "Port {{ item }} is closed"
      with_items: [80,443,8443]
Konstantin Suvorov
fonte
2
Obrigado, isso funciona também, mas optei por seguir a primeira sugestão, pois isso permite que eu personalize ainda mais a peça.
AWhitaker
O que é -G 1que não consigo encontrar nas páginas de manual?
lonix
0

Você pode usar o módulo wait_for para o mesmo

exemplo citado na documentação:

- name: Wait 300 seconds for port 8000 of any IP to close active connections, don't start checking for 10 seconds
  wait_for:
    host: 0.0.0.0
    port: 8000
    delay: 10
    state: drained
user128364
fonte
Por favor, tente formatar o seu post corretamente, todos os sites na rede Stackexchange permitir que a mesma remarcação, documentação para a formatação estiver aqui
Tensibai
3
BTW eu falhar também ver o que esta resposta acrescenta que não é em resposta RichVel já
Tensibai
0

Usamos nossa ferramenta dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) para essas tarefas. Você pode definir sua expectativa

{:netcat [{:host "mywebserver.com" :port "443"} {:host "telnet mywebserver.com" :port "80"} {:host "telnet mywebserver.com" :port "8443"}]}

e teste essas expectativas no localhost ou no remote pelo ssh. Para testes remotos, você deve definir um destino:

{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2" :node-ip "18.194.113.138"}] :provisioning-user {:login "ubuntu"}}

Você pode executar o teste java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

jerger
fonte