DevOps, watching you !
Et oui, il faut bien les surveiller vos clients, non ? Ah non, pardon, je voulais dire : « les accompagner » !
Le sysadmin que vous êtes, se doit d’être en mesure de récupérer le plus rapidement possible la consommation (quelle qu’elle soit) d’un utilisateur.
Depuis quelques semaines, je joue avec Swift (OpenStack Object Storage). Dans l’ensemble j’arrive à faire ce que je veux mais (car il y a toujours un « mais ») récupérer de l’information sur d’autres utilisateurs que le sien n’est pas une mince affaire.
En effet, utiliser le client python-swiftclient pour lister ses propres conteneurs (buckets chez Amazon), ses propres fichiers, etc… c’est simple.
$ swift --os-auth-url http://identity.enocloud.com:5000/v2.0/ --os-tenant-name goldyfruit-bidouilles --os-username goldyfruit --os-password regardeDTC list --lh
Résultat :
0 0 2014-02-12 19:37:55 c002 4 25 2013-11-27 14:20:20 c001 4 25
On voit très rapidement que le tenant (projet) goldyfruit-bidouilles possède deux conteneurs, le conteneur c001 contient quatre fichiers et ces quatre fichiers utilisent un espace de 25Ko.
Hélas, le client ci-dessus ne permet pas de lister les conteneurs du tenant de bob-leponge (et pourtant j’en ai vraiment envie). Je vous vois venir, vous allez essayer de remplacer la valeur de l’option –os-tenant-name, ça ne fonctionnera pas !
Que l’API de Swift soit !
Comme tout élément de la plate-forme OpenStack, Swift possède une API plutôt bien faite et bien documentée. C’est donc cette API (entre autre) qui va nous permettre de récupérer les informations souhaitées.
Avant de jouer avec les API de Keystone et de Swift, il est nécessaire de s’assurer que le compte admin (ou celui de votre choix) soit bien présent dans le rôle ResellerAdmin.
Récupération des ID nécessaires :
$ USER_ID=$(keystone user-get admin | awk -v var="id" '$0 ~ var { print $4 }') $ TENANT_ID=$(keystone tenant-get admin | awk -v var="id" '$0 ~ var { print $4 }') $ ROLE_ID=$(keystone role-get ResellerAdmin | awk -v var="id" '$0 ~ var { print $4 }')
Ajout du rôle ResellerAdmin à l’utilisateur admin :
$ keystone user-role-add --user-id $USER_ID --role-id $ROLE_ID --tenant-id $TENANT_ID
Ou, vous pouvez directement utiliser les noms au lieu des ID (c’est un peu plus lisible) :
$ keystone user-role-add --user admin --role-id ResellerAdmin --tenant-id admin
Une petite vérification de routine :
$ keystone user-role-list --user admin
Résultat :
+----------------------------------+---------------+----------------------------------+----------------------------------+ | id | name | user_id | tenant_id | +----------------------------------+---------------+----------------------------------+----------------------------------+ | cc26edf3d13447a8a67cd80f2483b139 | ResellerAdmin | 8ccddb2afd0e461bb1acf1ce8dbcdc3b | 8823540f42ec420ba6b9786a05553d50 | | 120c2e8e66e44e558e9cfe2ec9d4e39c | admin | 8ccddb2afd0e461bb1acf1ce8dbcdc3b | 8823540f42ec420ba6b9786a05553d50 | +----------------------------------+---------------+----------------------------------+----------------------------------+
Désormais l’utilisateur admin fait partie du rôle ResellerAdmin, il reste une dernière chose à vérifier. Le rôle ResellerAdmin est-t’il bien celui utilisé par Swift ? Pour le vérifier il suffit de grepper le fichier de configuration Swif.
$ grep reseller_admin_role /etc/swift/proxy-server.conf
Résultat :
reseller_admin_role = ResellerAdmin
Tout est correctement configuré ? Non ? Try Again 😛
L’API qui chante (nul…)
Pour ceux qui n’ont pas compris la référence, allez faire un petit tour ici et pour ceux à qui je fais de la peine, désolé…
Trêve de plaisanteries, la récupération des informations va se dérouler en trois étapes :
- Récupérer un token Keystone
- Récupérer l’ID du tenant souhaité
- Récupérer la liste des conteneurs du tenant
Récupérer un token Keystone
$ curl -s -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "regarde-en-toi"}}}' -H 'Content-type: application/json' http://identity.enocloud.com:5000/v2.0/tokens | python -mjson.tool | awk -v var="\"id\": \"M" '$0 ~ var { print $2 }' | sed -e 's/"//g' -e 's/,//g > /tmp/token
Résultat :
MIINmgYJKoZIhvcNAQcCoIINizCCDYcCAQExCTAHBgUrDgMCGjCCDHMGCSqGSIb3DQEH < . . . >
Le token est normalement bien plus long, pour l’exemple je l’ai pas mal raccourci.
Récupérer l’ID du tenant souhaité
$ curl -s -H "X-Auth-Token: $(cat /tmp/token)" http://identity.enocloud.com:35357/v2.0/tenants | python -mjson.tool | grep -B1 name | awk -F":" '{ print $2 }' | sed -e 's/"//g' -e 's/,//g' -e 's/^ //g'
Résultat :
f9bb26c6523e4e7d9ef5376e40301655 bob.leponge fa7075f571f64847920d136a0fe970aa goldyfruit-bidouilles fc47c4103c9b4aaf9271c581786a268f cest.pasmafaute ffb92d3eb09a49a08bc6ec2391ecc108 edithpiaf.estmorte ffd9a89e084e441f97ff56b8341bbb2b odile.deray
Il ne reste plus qu’à choisir l’ID en relation avec le nom du tenant que vous souhaitez analyser. Exemple, pour le tenant odile.deray, l’ID sera ffd9a89e084e441f97ff56b8341bbb2b
Récupérer la liste des conteneurs du tenant
$ curl -s -H "X-Auth-Token: $(cat /tmp/token)" http://swift-api.enocloud.com:8080/v1/AUTH_ffd9a89e084e441f97ff56b8341bbb2b
Résultat :
kinoton gencives-de-porc émile
Le résultat est significatif, le tenant odile.deray possède trois conteneurs (et pas n’importe lesquels ^^).
Feignant ? Ce script est pour toi !
Ce script permet de lister tous les conteneurs Swift de tous les tenants recensés dans Keystone. Il fournit les informations suivantes :
- Nom du tenant Keystone
- Nombre de conteneurs Swift par tenant
- Nom des conteneurs Swift par tenant
- Nombre total des conteneurs Swift
Utilisation :
Usage: ./get_all_swift_containers_per_tenant [OPTIONS] -h|--help Display this help \o/ -a|--all-containers Display all containers per tenant
#!/bin/bash # # Get all Swift containers per Keystone tenants # # Author: Gaëtan Trellu <gaetan.trellu@incloudus.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # Requirement: curl python # # Tenant informations USER_ADMIN="admin" PASSWORD_ADMIN="password" TENANT_ADMIN="admin" # Keystone endpoints (user and admin) KEYSTONE_ADMIN_URL="http://identity.enocloud.com:35357/v2.0" KEYSTONE_URL="http://identity.enocloud.com:5000/v2.0" # Swift endpoint SWIFT_URl="http://swift-api.enocloud.com:8080/v1" if [ "$1" == "-h" -o "$1" == "--help" ] then echo echo "Usage: $0 [OPTIONS]" echo " -h|--help Display this help \o/" echo " -a|--all-containers Display all containers per tenant" echo exit 0 fi # Get a Keystone token TOKEN=$(curl -s -d '{"auth": {"tenantName": "'$TENANT_ADMIN'", "passwordCredentials": {"username": "'$USER_ADMIN'", "password": "'$PASSWORD_ADMIN'"}}}' -H 'Content-type: application/json' "$KEYSTONE_URL"/tokens | python -mjson.tool | awk -v var="\"id\": \"M" '$0 ~ var { print $2 }' | sed -e 's/"//g' -e 's/,//g') # Get all Keystone tenants ID TENANTS_ID=$(curl -s -H "X-Auth-Token: $TOKEN" "$KEYSTONE_ADMIN_URL"/tenants | python -mjson.tool | awk -v var="id" '$0 ~ var { print $2 }' | sed -e 's/"//g' -e 's/,//g' | grep -e "[a-z][0-9]") # Set the TOTAL variable TOTAL=0 echo echo "=====================================" echo "# Display the Swift containers list #" echo "=====================================" echo for TENANT in $TENANTS_ID do # Set the COUNT variable COUNT=0 # Get the Keystone tenant name TENANT_NAME=$(curl -s -H "X-Auth-Token: $TOKEN" "$KEYSTONE_ADMIN_URL"/tenants/"$TENANT" | python -mjson.tool | awk -v var="name" '$0 ~ var { print $2 }' | sed 's/"//g') # Get the Swift containers list per Keystone tenant CONTAINERS_LIST=$(curl -s -H "X-Auth-Token: $TOKEN" "$SWIFT_URl"/AUTH_"$TENANT") # Count the Swift containers per Keystone tenant and make a sum for CONTAINER in $CONTAINERS_LIST do COUNT=$((COUNT+1)) TOTAL=$((TOTAL+1)) done # If Keystone tenant had Swift containers, there are displayed if [ ! -z "$CONTAINERS_LIST" ] then echo "[#] $TENANT_NAME | Container(s) : ["$COUNT"]" if [ "$1" == "--all-containers" -o "$1" == "-a" ] then for CONTAINER in $(echo $CONTAINERS_LIST | tr ' ' '\n') do echo " - $CONTAINER" done echo fi fi done if [ -z "$1" ] then echo fi echo "=====================================" echo "# Total Swift containers : [ "$TOTAL" ] #" echo "====================================="
Liens
- https://answers.launchpad.net/swift/+question/223220 (merci chmouel)
- http://docs.openstack.org/api/openstack-object-storage/1.0/content/
Gaëtan Trellu (goldyfruit)
Derniers articles parGaëtan Trellu (goldyfruit) (voir tous)
- Qinling, let’s the journey begin! - 23 mai 2019
- systemd-networkd, l’âge de la maturité ? - 13 mars 2018
- Hyper-V, Nova, VxLAN et Open vSwitch, enfin une belle histoire ! - 31 décembre 2017
Lister les conteneurs (buckets) Swift de tous les tenants par Gaëtan Trellu (goldyfruit) est sous Licence Creative Commons Internationale Attribution 4.0.