O motivo deste artigo foi uma postagem no bate - papo do @pró_ansible:
Vladislav? Shishkov, [17.02.21 20:59] Senhores, há duas perguntas sobre uma operação longa personalizada, por exemplo, um backup: 1. É possível apertar a barra de progresso de um bash personalizado através do ansible? (se for através de um plugin, então vá para algum exemplo ou documentação pliz) 2. Parece que você quer escrever um plugin para este bash, mas surge a pergunta, como ser e como resolver os momentos de execução que são idempotentes?
Uma busca rápida no quintal da memória não sugeriu nada adequado. No entanto, eu definitivamente me lembrei de que o código Ansible é fácil de ler e a extensão de suporte "tinkers" por plug-ins e módulos Python regulares. E se for assim, então nada impede de mais uma vez ultrapassar os limites do possível. Segure minha cerveja! ...
É claro que o Ansible padrão já sabe fazer as duas etapas, apenas o "escape" resultante é coletado em um único todo e transmitido ao host de controle após o término do processo, e queremos fazer isso em tempo real. Portanto, você pode pelo menos olhar para a implementação existente e, no máximo, reutilizar de alguma forma o código existente.
A pergunta original pode ser resumida em duas etapas simples:
Capture stdout de um comando no host de destino
Envie-o para o host de gerenciamento.
Transferimos dados para o host de controle
Sugiro começar pelo final: com a organização de um canal de transmissão adicional para o host de controle. A solução para essa pergunta parece bastante óbvia: lembre-se de que o Ansible é executado em cima do ssh e use a função de encaminhamento de porta:
Código Python
# - :
# https://github.com/ansible/ansible/blob/5078a0baa26e0eb715e86c93ec32af6bc4022e45/lib/ansible/plugins/connection/ssh.py#L662
self._add_args(
b_command,
(b"-R", b"127.0.0.1:33333:" + to_bytes(self._play_context.remote_addr, errors='surrogate_or_strict', nonstring='simplerepr') + b":33335"),
u"ANSIBLE_STREAMING/streaming set"
)
? ssh- 33333 127.0.0.1, - 33335.
netcat
( , ?): nc -lk 33335
.
, , Ansible , , : , nc 127.0.0.1 33333
, - .
stdout
- . stdout - - Ansible «shell». , - , , command. , , , . « », .
« » :
# basic.py, import'
import socket
# run_command - - :
# https://github.com/ansible/ansible/blob/5078a0baa26e0eb715e86c93ec32af6bc4022e45/lib/ansible/module_utils/basic.py#L2447
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
clientSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
clientSocket.connect(("127.0.0.1",33333));
# run_command - - :
# https://github.com/ansible/ansible/blob/5078a0baa26e0eb715e86c93ec32af6bc4022e45/lib/ansible/module_utils/basic.py#L2455
clientSocket.send(b_chunk);
# run_command - -
# https://github.com/ansible/ansible/blob/5078a0baa26e0eb715e86c93ec32af6bc4022e45/lib/ansible/module_utils/basic.py#L2481
clientSocket.close()
? , Ansible. : connection plugin, Ansible. chemtech «-2019» ( , Python- ), :-)
Ansible?
- , , Ansible. , .
, , .