Seguimos bombeando Ansible

El motivo de este artículo fue una publicación en el chat de @ pro_ansible:





Vladislav? Shishkov, [17.02.21 20:59] Señores, hay dos preguntas con respecto a una operación larga personalizada, por ejemplo, una copia de seguridad: 1. ¿Es posible ajustar la barra de progreso de un bash personalizado a través del ansible? (si es a través de un plugin, entonces pasa a algún ejemplo o pliz de documentación) 2. Parece que quieres escribir un plugin para este bash, pero surge la pregunta, ¿cómo ser y cómo resolver los momentos de ejecución que son idempotentes?





Una búsqueda rápida en el patio trasero de la memoria no sugirió nada adecuado. Sin embargo, definitivamente recordé que el código de Ansible es fácil de leer, y la extensión de soporte "tinkers" tanto por complementos como por módulos regulares de Python. Y si es así, nada impide volver a empujar los límites de lo posible. ¡Sostenga mi cerveza! ...





Está claro que Ansible estándar ya sabe cómo realizar ambos pasos, solo el "escape" resultante se recopila en un solo todo y se transmite al host de control después del final del proceso, y queremos hacerlo en tiempo real. Por lo tanto, puede al menos mirar la implementación existente y, como máximo, reutilizar de alguna manera el código existente.





La pregunta original se puede resumir en dos simples pasos:





  1. Capturar la salida estándar de un comando en el host de destino





  2. Envíelo al host de administración.





Transferimos datos al host de control

Sugiero comenzar desde el final: con la organización de un canal de transmisión adicional al host de control. La solución a esta pregunta parece bastante obvia: recuerde que Ansible se ejecuta sobre ssh y use la función de reenvío de puertos:





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- ), :-)





, «». , tmux .





:





  • stdout -Python , Ansible' - , , ;





  • ssh- stdout Ansible .





Ansible?

- , , Ansible. , .





, , .








All Articles