Quelles sont les performances raisonnables pour un simple playbook Ansible contre ~ 100 hôtes?

11

Nous commençons à envisager Ansible pour remplacer une ancienne installation de cfengine2. J'ai un playbook simple qui:

  • copie un fichier sudoers
  • copie un modèle resolv.conf (alimenté par les données group_vars et host_vars)
  • vérifie que deux services sont en cours d'exécution
  • vérifie la présence d'un utilisateur local

Le playbook prend plus de 4 minutes d'horloge murale pour fonctionner contre 97 machines (toutes connectées via un réseau rapide de 1 Go ou 10 Go, avec une latence LAN inférieure à 1 ms) et consomme plus de 50% du processeur sur la machine virtuelle à mémoire vive 4G à 2 cœurs lorsque je suis l'exécuter.

Il faut environ 11 secondes pour s'exécuter sur une seule machine, avec environ 4 secondes de temps processeur utilisateur + sys consommé, ce qui semble encore un peu excessif TBH pour la quantité de travail impliqué.

Les bits évidents:

  • J'ai le pipeline explicitement activé dans un répertoire playbook-ans localible.cfg
  • J'ai la mise en cache des faits sur jsonfile activée, même ansible.cfg local
  • J'ai des fourches réglées à 50, les mêmes (j'ai essayé d'autres valeurs)
  • Je suis sûr qu'Ansible utilise SSH et non Paramiko et qu'il utilise le socket de contrôle persistant - je peux voir les processus SSH démarrés et persistants pendant l'exécution.

Ce niveau de performance est-il normal ou quelque chose ne va pas avec ma configuration? Comment puis-je déterminer quoi, le cas échéant?

Edit: En août 2017, nous voyons toujours ce problème. La version Ansible est 2.2.1 et la taille du playbook a maintenant augmenté. Numéros à jour:

  • 98 hôtes
  • ansible -m ping all prend 4,6 s réel, 3,2 s utilisateur, 2,5 s sys fois
  • une exécution complète du livre de lecture prend 4 minutes, en utilisant 100% d'utilisateurs et ~ 35% de CPU système tout en le faisant (sur un serveur de déploiement de VM à 2 cœurs, 100% étant un CPU complet)
  • le système d'exploitation cible est largement CentOS 7, certains CentOS 6
  • le profilage ne révèle aucun point chaud de tâche spécifique AFAICT

Bien que le playbook soit maintenant beaucoup plus grand, je ne pense toujours pas qu'il y ait quoi que ce soit là-dedans pour justifier ce niveau de charge CPU sur le serveur de playbook - heure d'horloge, peut-être, mais le serveur de déploiement devrait être largement inactif pendant la majeure partie de la course, autant que je sache, il s'agit principalement de copies de fichiers et de quelques extensions de modèles.

Notez que nous utilisons assez largement les hôtes / groupvars

Plusieurs personnes ont posé des questions sur le profilage, à la suite d'une analyse avec profilage:

Tuesday 01 August 2017  16:02:24 +0100 (0:00:00.539)       0:06:22.991 ******** 
=============================================================================== 
yumrepo : centos repos -------------------------------------------------- 9.77s
sshd : copy CentOS 6 sshd config ---------------------------------------- 7.41s
sshd : copy CentOS 7 sshd config ---------------------------------------- 6.94s
core : ensure core packages are present --------------------------------- 6.28s
core : remove packages on VM guests ------------------------------------- 5.39s
resolv : stop NetworkManager changing resolv.conf ----------------------- 5.25s
yumrepo : epel6 gpg key ------------------------------------------------- 3.94s
yumrepo : epel7 gpg key ------------------------------------------------- 3.71s
yumrepo : nsg gpg key --------------------------------------------------- 3.57s
resolv : build resolv.conf ---------------------------------------------- 3.30s
yumrepo : nsg repo ------------------------------------------------------ 2.66s
resolv : check NetworkManager running ----------------------------------- 2.63s
yumrepo : psp repo ------------------------------------------------------ 2.62s
yumrepo : ucs repo ------------------------------------------------------ 2.44s
yumrepo : epel repo ----------------------------------------------------- 2.27s
resolv : check for nmcli ------------------------------------------------ 2.08s
core : remove various unwanted files ------------------------------------ 1.42s
telegraf : write telegraf.conf file ------------------------------------- 1.13s
core : copy sudoers in place -------------------------------------------- 0.94s
core : ensure sshd is running ------------------------------------------- 0.90s
user53814
la source
4
Faites du profilage avec ANSIBLE_CALLBACK_WHITELIST=profile_taskset pour un débogage plus approfondi avec ANSIBLE_DEBUG=1. Faites également très attention à la vitesse de connexion ssh initiale.
Konstantin Suvorov
D'accord avec le commentaire de @ KonstantinSuvorov - il pourrait y avoir un seul hôte dans le lot qui prend un temps considérable sur une certaine tâche. Une fois que vous avez isolé la tâche avec profile_tasks, vous pouvez examiner l'exécution de ces tâches uniquement sur vos hôtes et voir celle qui est la plus longue. Vous pouvez également exécuter une tâche triviale, comme "command: w" sur tous les hôtes pour voir que cela prend un temps attendu.
andyhky
1
Vérifiez la famine d'entropie. watch cat /proc/sys/kernel/random/entropy_availpendant que le playbook est en cours d'exécution. Si c'est moins de 1000, vous avez un problème potentiel; si son moins que 64 et ne récupère pas, alors vous avez un problème de famine d'entropie défini. (commun dans certains environnements VM). Cela s'applique à votre serveur de gestion ainsi qu'aux nœuds que vous gérez.
Cameron Kerr
Sur ma machine virtuelle de gestion avec 4 Go de RAM, j'ai des fourches = 20 et un pipelining = True. ansible -i all all -m pingcontre plus de 300 hôtes (principalement des VM) a pris un peu moins d'une minute. Votre playbook fait-il quelque chose pour changer d'utilisateur (devenir / sudo / etc.). À quoi ressemble «-m ping»? Je dirais, d'après mon expérience, que vous voulez avoir plus de mémoire pour 50 fourchettes.
Cameron Kerr
quel est votre système d'exploitation cible?
xddsg

Réponses:

1

dans votre ansible.cfgensemble les éléments suivants:

[defaults]

# profile each task
callback_whitelist = profile_tasks

# [don't validate host keys](http://docs.ansible.com/ansible/intro_configuration.html#host-key-checking)
host_key_checking = False

[ssh_connection]
pipelining = True

De plus, dans votre livre de jeu, définissez la stratégie comme «gratuite»

- hosts: all
  strategy: free
  tasks: [...]

Enfin, désactivez la collecte des faits sur votre jeu: gather_facts: false

Si, après le profilage, vous voyez beaucoup de ceci:

TASK [pip foo]
ok: [10.192.197.252] => (item=ansible)
ok: [10.192.197.252] => (item=boto)
ok: [10.192.197.252] => (item=boto3)
ok: [10.192.197.252] => (item=passlib)
ok: [10.192.197.252] => (item=cryptography)

écraser ces actions dans ansible.cfg[par défaut]:

par exemple squash_actions = yum,pip,bar

xddsg
la source
Merci pour la réponse. Nous utilisons déjà la stratégie: la collecte gratuite et factuelle, je le crains, est quelque chose dont les playbooks ont besoin, donc cela ne fonctionne pas vraiment. Comme indiqué dans ma réponse, je fais déjà du pipelining.
user53814
@ user53814 avec le profilage activé, qu'est-ce qui prend le plus de temps? pouvez-vous mettre à jour votre question avec la version d'ansible que vous utilisez?
xddsg