La raison de cet article était un message dans le chat de @ pro_ansible:
Vladislav? Shishkov, [17.02.21 20:59] Messieurs, il y a deux questions concernant une opération longue personnalisée, par exemple, une sauvegarde: 1. Est-il possible de resserrer la barre de progression d'un bash personnalisé via l'ansible? (si par le biais d'un plugin, alors lancez-vous dans un exemple ou une documentation pliz) 2. Il semble que vous vouliez écrire un plugin pour cette bash, mais la question se pose, comment être et comment résoudre les moments d'exécution qui sont idempotents?
Une recherche rapide dans l'arrière-cour de la mémoire n'a rien suggéré de convenable. Néanmoins, je me suis vraiment souvenu que le code Ansible était facile à lire et que l'extension "bricoler" supportait à la fois les plugins et les modules Python classiques. Et si tel est le cas, rien n'empêche de repousser à nouveau les limites du possible. Tiens ma bière! ...
Il est clair qu'Ansible standard sait déjà comment faire les deux étapes, seul le "pot d'échappement" résultant est collecté en un seul tout et transmis à l'hôte de contrôle après la fin du processus, et nous voulons le faire en temps réel. Par conséquent, vous pouvez au moins examiner l'implémentation existante et, au maximum, réutiliser le code existant.
La question initiale peut se résumer en deux étapes simples:
Capture stdout d'une commande sur l'hôte cible
Envoyez-le à l'hôte de gestion.
Nous transférons les données à l'hôte de contrôle
Je propose de partir de la fin: avec l'organisation d'un canal de transmission supplémentaire vers l'hôte de contrôle. La solution à cette question semble assez évidente: rappelez-vous qu'Ansible s'exécute sur ssh et utilisez la fonction de redirection de port:
Code 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. , .
, , .