Guillaume Fenollar DevOps et SysAdmin Freelance

Guillaume FENOLLAR

Ingénieur Linux/DevOps Indépendant

− Montpellier −

GOVC, le CLI pour manipuler l'API vSphere de VMWare

Les utilisateurs de l'UI vSphere ont leurs vilaines habitudes, qui est parfois de se contenter de cet interface web rendant certaines opérations laborieuses. D'autant plus quand, comme dans mon cas, l'application est utilisée la grande majorité du temps à travers un VPN et où la moindre petite opération peut prendre plusieurs minutes à s'accomplir. Govc est un outil en ligne de commande permettant d'intéragir avec l'API VSphere. Une fois adopté, vous ne pourrez pas revenir en arrière !

Cet outil, développé par VMWare lui-même est maintenant utilisé par de nombreux projets majeurs, et même si la dernière version semble toujours beta pour le moment (v0.22 à l’heure où ces lignes sont écrites), je pense que le projet est assez mature et peut-être utilisé en production sans problème. Pour le récupérer, direction le github du projet qui donne accès à des binaires prêts à l’emploi (ici v0.22.1). Il vous permettra de gagner du temps, et surtout d’automatiser facilement certaines tâches de maintenance.

Installation et configuration

# Téléchargement de la version 0.22.1
curl https://github.com/vmware/govmomi/releases/download/v0.22.1/govc_linux_amd64.gz | gunzip > /usr/bin/govc

Le programme fournit un vaste choix d’arguments pour définir les conditions d’accès à l’API (par exemple son URL, l’utilisateur/mot de passe à utiliser, etc…) mais je vous conseille bien sûr d’utiliser des variables d’environnement pour gérer plus efficacement vos clusters, surtout si vous êtes amenés à vous connecter à plusieurs APIs. Au lieu de les définir à la volée, il vaut mieux les placer dans un fichier pour réutilisation lors d’une autre session. Voici un sample de fichier à sourcer.

# govc.env
export GOVC_DATACENTER=<Nom du datacenter par défaut au sens VMWare du terme>
export GOVC_USERNAME=<Utilisateur vmware>
export GOVC_PASSWORD=<Mot de passe>
export GOVC_URL=<IP ou hostname du vsphere>
export GOVC_INSECURE=1 # Ignorer les problèmes de certificat, utile en réseau local
export GOVC_DATASTORE=<Datastore par défaut>
# Si besoin d'utiliser un proxy réseau
# export HTTP_PROXY=http://172.17.1.1:3128 
# export HTTPS_PROXY=http://172.17.1.1:3128

Enfin, comme pour tout fichier contenant des variables d’environnement, il suffit de le sourcer dans un terminal

source govc.env

Au lancement de chaque commande, des options peuvent être modifiées à la volée pour surcharger les variables d’environnement, par exemple :

govc datastore.ls -dc=Datacenter2 -ds=Datastore1 -debug=true

À noter que si vous utilisez la commande debug (le “=true” est optionnel, s’agissant d’un flag Go), un dossier caché .govmomi/debug sera créé avec des logs vous permettant de tracer votre problème.

Usage

Je vais vous exposer ici quelques commandes simples puis quelques examples d’applications concrètes. Tout d’abord, il faut comprendre qu’au sein d’un datacenter, sont regroupés les objets d’un même type, sous vm, network, host et datastore. Ainsi, comme vous allez le deviner très vite, il existe deux méthodes pour lister les hosts, soit par la commande govc ls host ou govc find /host. Mais explorons tout ça sans perdre plus de temps.

Lister les objets d’un DC

govc ls
# Le résultat donne :
# /DC/vm
# /DC/network
# /DC/host
# /DC/datastore
govc ls vm/dossier-vm/vm-1
govc ls host

Lister tous les objets du vcenter. Lister les vm avec “prod” dans le nom. Enfin, lister les hosts avec 16 cpu.

govc find /
govc find vm -type m -name *prod*
govc find . -type h -hardware.cpuInfo.numCpuCores 16

Lister les informations des datastore (notamment l’usage disque), explorer le datastore spécifié en envvar, créer un dossier, y envoyer un fichier local, puis un fichier en stdin.

govc datastore.info
govc datastore.ls dossier-1/
govc datastore.mkdir dossier-isos/
govc datastore.upload image.iso dossier-isos/image.iso
curl https://example.com/iso/image.iso | govc datastore.upload - dossier-isos/image.iso

Afficher les informations étendues d’une VM, la snapshotter, la rebooter puis ouvrir une console (nécessite vmrc)

# À noter qu'il n'y a ni le DC, ni le prefix "vm" dans le path retourné par la commande govc ls, il est induit
vm=Prod/Machine_virtuelle_1
govc vm.info -e $vm
govc snapshot.create $vm snapshot-$(date +%F)
govc vm.power -r $vm
xdg-open $(govc vm.console $vm)

Afficher les controlleurs et disques attachés à une VM, démonter un de ceux-là, en créer un nouveau sur le datastore, puis l’attacher à la VM. Enfin, attacher un nouvel ISO.

govc device.info -vm <VM>
# Keep permet de ne pas supprimer le disque au déttachement ! disk_ref correspond à l'ID selon la VM spécifiée, par exemple "disk-1000-3"
govc device.remove -keep -vm <VM> <disk_ref>
govc datastore.disk.create -size 15G <disk_name>
govc vm.disk.attach -vm <VM> -disk <path/to/disk_name.vmdk>
# dev est le nom de device du cdrom, par exemple cdrom-3000
govc device.cdrom.insert -vm <VM> -device <dev> <path/to/file.iso>

Récupérer sur quel host tourne une VM donnée pour l’exemple par son UUID. Lister les informations et ressources disponibles sur l’host et également ses interfaces/IPs

host=$(govc vm.info -vm.uuid=4233b143-7171-e260-deaa-52921b064dfb | awk '/Host/ {print $2}')
govc host.info $host
govc host.esxcli -host=$host network ip interface ipv4 get
Les options disponibles pour esxcli sont accessibles ici

Liste des commandes

Si vous voulez juste vous faire une idée des possibilités de l’outil sans le télécharger, voici une liste des commandes disponibles en v0.22

Usage of govc:
  about
  about.cert
  cluster.add
  cluster.change
  cluster.create
  cluster.group.change
  cluster.group.create
  cluster.group.ls
  cluster.group.remove
  cluster.override.change
  cluster.override.info
  cluster.override.remove
  cluster.rule.change
  cluster.rule.create
  cluster.rule.info
  cluster.rule.ls
  cluster.rule.remove
  datacenter.create
  datacenter.info
  datastore.cluster.change
  datastore.cluster.info
  datastore.cp
  datastore.create
  datastore.disk.create
  datastore.disk.inflate
  datastore.disk.info
  datastore.disk.shrink
  datastore.download
  datastore.info
  datastore.ls
  datastore.maintenance.enter
  datastore.maintenance.exit
  datastore.mkdir
  datastore.mv
  datastore.remove
  datastore.rm
  datastore.tail
  datastore.upload
  datastore.vsan.dom.ls
  datastore.vsan.dom.rm
  device.boot
  device.cdrom.add
  device.cdrom.eject
  device.cdrom.insert
  device.connect
  device.disconnect
  device.floppy.add
  device.floppy.eject
  device.floppy.insert
  device.info
  device.ls
  device.remove
  device.scsi.add
  device.serial.add
  device.serial.connect
  device.serial.disconnect
  device.usb.add
  disk.create
  disk.ls
  disk.register
  disk.rm
  disk.snapshot.create
  disk.snapshot.ls
  disk.snapshot.rm
  disk.tags.attach
  disk.tags.detach
  dvs.add
  dvs.change
  dvs.create
  dvs.portgroup.add
  dvs.portgroup.change
  dvs.portgroup.info
  env
  events
  export.ovf
  extension.info
  extension.register
  extension.setcert
  extension.unregister
  fields.add
  fields.info
  fields.ls
  fields.rename
  fields.rm
  fields.set
  find
  firewall.ruleset.find
  folder.create
  folder.info
  guest.chmod
  guest.chown
  guest.df
  guest.download
  guest.getenv
  guest.kill
  guest.ls
  guest.mkdir
  guest.mktemp
  guest.mv
  guest.ps
  guest.rm
  guest.rmdir
  guest.run
  guest.start
  guest.touch
  guest.upload
  host.account.create
  host.account.remove
  host.account.update
  host.add
  host.autostart.add
  host.autostart.configure
  host.autostart.info
  host.autostart.remove
  host.cert.csr
  host.cert.import
  host.cert.info
  host.date.change
  host.date.info
  host.disconnect
  host.esxcli
  host.info
  host.maintenance.enter
  host.maintenance.exit
  host.option.ls
  host.option.set
  host.portgroup.add
  host.portgroup.change
  host.portgroup.info
  host.portgroup.remove
  host.reconnect
  host.remove
  host.service
  host.service.ls
  host.shutdown
  host.storage.info
  host.storage.mark
  host.storage.partition
  host.vnic.change
  host.vnic.info
  host.vnic.service
  host.vswitch.add
  host.vswitch.info
  host.vswitch.remove
  import.ova
  import.ovf
  import.spec
  import.vmdk
  library.clone
  library.create
  library.deploy
  library.export
  library.import
  library.info
  library.ls
  library.rm
  library.session.ls
  library.session.rm
  library.sync
  license.add
  license.assign
  license.assigned.ls
  license.decode
  license.label.set
  license.ls
  license.remove
  logs
  logs.download
  logs.ls
  ls
  metric.change
  metric.info
  metric.interval.change
  metric.interval.info
  metric.ls
  metric.reset
  metric.sample
  object.collect
  object.destroy
  object.method
  object.mv
  object.reload
  object.rename
  object.save
  option.ls
  option.set
  permissions.ls
  permissions.remove
  permissions.set
  pool.change
  pool.create
  pool.destroy
  pool.info
  role.create
  role.ls
  role.remove
  role.update
  role.usage
  session.login
  session.logout
  session.ls
  session.rm
  snapshot.create
  snapshot.remove
  snapshot.revert
  snapshot.tree
  sso.group.create
  sso.group.ls
  sso.group.rm
  sso.group.update
  sso.service.ls
  sso.user.create
  sso.user.id
  sso.user.ls
  sso.user.rm
  sso.user.update
  tags.attach
  tags.attached.ls
  tags.category.create
  tags.category.info
  tags.category.ls
  tags.category.rm
  tags.category.update
  tags.create
  tags.detach
  tags.info
  tags.ls
  tags.rm
  tags.update
  task.cancel
  tasks
  vapp.destroy
  vapp.power
  version
  vm.change
  vm.clone
  vm.console
  vm.create
  vm.customize
  vm.destroy
  vm.disk.attach
  vm.disk.change
  vm.disk.create
  vm.guest.tools
  vm.info
  vm.ip
  vm.keystrokes
  vm.markastemplate
  vm.markasvm
  vm.migrate
  vm.network.add
  vm.network.change
  vm.option.info
  vm.power
  vm.question
  vm.rdm.attach
  vm.rdm.ls
  vm.register
  vm.unregister
  vm.upgrade
  vm.vnc

Voilà, je pense que vous avez une bonne idée de ce qu’on peut faire avec cet outil, même si nous avons abordé moins de 5% des possibilités. L’aide en ligne (j’entends par-là en lançant la commande voulu avec le flag –help) est très précise et de qualité, ce qui en fait une cli très agréable à utiliser et indispensable dans la boite à outil de tout administrateur devant travailler en milieu virtualisé.