Wir pumpen weiter Ansible

Der Grund für diesen Artikel war ein Beitrag im Chat von @ pro_ansible:





Vladislav? Shishkov, [17.02.21 20:59] Meine Herren, es gibt zwei Fragen zu einer benutzerdefinierten langen Operation, z. B. einer Sicherung: 1. Ist es möglich, den Fortschrittsbalken einer benutzerdefinierten Bash durch das Ansible zu verschärfen? (Wenn über ein Plugin, dann treten Sie in ein Beispiel oder einen Dokumentationsplan ein.) 2. Es scheint, als wollten Sie ein Plugin für diese Bash schreiben, aber es stellt sich die Frage, wie man sein soll und wie man die Momente der Ausführung löst, die idempotent sind.





Eine schnelle Suche im Hinterhof der Erinnerung ergab nichts Passendes. Trotzdem erinnerte ich mich definitiv daran, dass der Ansible-Code leicht zu lesen ist und die "Tinkers" die Erweiterung sowohl durch Plugins als auch durch reguläre Python-Module unterstützen. Und wenn ja, dann hindert nichts daran, die Grenzen des Möglichen noch einmal zu verschieben. Halte mein Bier! ...





Es ist klar, dass Standard Ansible bereits weiß, wie beide Schritte auszuführen sind. Nur der resultierende "Auspuff" wird in einem einzigen Ganzen gesammelt und nach dem Ende des Prozesses an den Steuerungshost übertragen, und wir möchten dies in Echtzeit tun. Daher können Sie zumindest die vorhandene Implementierung betrachten und maximal - den vorhandenen Code irgendwie wiederverwenden.





Die ursprüngliche Frage lässt sich auf zwei einfache Schritte reduzieren:





  1. Erfassen Sie den Standard eines Befehls auf dem Zielhost





  2. Senden Sie es an den Management-Host.





Wir übertragen Daten an den Kontrollhost

« »: . : , Ansible ssh, :





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