Ignorer les liens de navigation | |
Quitter l'aperu | |
![]() |
Guide d'administration des systèmes Oracle® ZFS Storage Appliance |
Utilisation de la présente documentation
Chapitre 1 Présentation d'Oracle ZFS Storage Appliance
Chapitre 3 Configuration initiale
Chapitre 4 Configuration réseau
Chapitre 5 Configuration de stockage
Chapitre 6 Configuration du réseau de stockage SAN
Chapitre 7 Configuration utilisateur
Chapitre 8 Définition des préférences de ZFSSA
Chapitre 9 Configuration des alertes
Chapitre 10 Configuration de cluster
Chapitre 12 Partages, projets et schéma
Chapitre 15 Ecriture de scripts à l'aide de la CLI
Commandes de traitement par lots
Il est évident que les scripts présentent uniquement un intérêt s'ils sont en mesure d'interagir avec le système dans son ensemble. Plusieurs fonctions intégrées permettent à vos scripts d'interagir avec le système :
|
La manière la plus simple pour les scripts d'interagir avec le système dans son ensemble est l'utilisation de la fonction "run" : celle-ci nécessite une commande à exécuter et renvoie la sortie de cette commande en tant que chaîne. Par exemple :
dory:> configuration version script dump(run('get boot_time')) ' boot_time = 2009-10-12 07:02:17\n'
La fonction dump intégrée procède au vidage de l'argument sans accroître les éventuelles nouvelles lignes incorporées. Les fonctionnalités de gestion des chaînes d'ECMAScript peuvent être utilisées pour décomposer la sortie. Voici par exemple le résultat de la scission sur la base des espaces de la sortie ci-dessus :
dory:> configuration version script dump(run('get boot_time').split(/\s+/)) ['', 'boot_time', '=', '2009-10-12', '07:02:17', '']
La fonction run est suffisamment puissante pour que l'utilisateur soit tenté de s'appuyer exclusivement sur l'analyse des sorties afin d'obtenir des informations sur le système. Son indéniable inconvénient est que les scripts correspondants analysent des sorties lisibles à l'oeil qui sont susceptibles de changer à l'avenir. Pour collecter des informations sur le système de manière plus fiable, servez-vous de la fonction "get" intégrée. Dans la cas de la propriété boot_time, cette fonction renvoie l'objet Date d'ECMAScript plutôt que la chaîne, et permet ainsi la manipulation par programmation de cette valeur de propriété. Par exemple, vous pouvez souhaiter utiliser la propriété boot_time conjointement avec l'heure actuelle pour déterminer la durée écoulée depuis l'initialisation :
script run('configuration version'); now = new Date(); uptime = (now.valueOf() - get('boot_time').valueOf()) / 1000; printf('up %d day%s, %d hour%s, %d minute%s, %d second%s\n', d = uptime / 86400, d < 1 || d >= 2 ? 's' : '', h = (uptime / 3600) % 24, h < 1 || h >= 2 ? 's': '', m = (uptime / 60) % 60, m < 1 || m >= 2 ? 's': '', s = uptime % 60, s < 1 || s >= 2 ? 's': '');
En supposant que le script ci-dessus est enregistré dans un fichier "uptime.aksh", vous pouvez l'exécuter de la manière suivante :
% ssh root@dory < uptime.aksh Pseudo-terminal will not be allocated because stdin is not a terminal. Password: up 2 days, 10 hours, 47 minutes, 48 seconds
Le message concernant l'allocation d'un pseudo-terminal est du au client ssh ; le problème correspondant peut être résolu en spécifiant l'option "-T" pour ssh.
Dans un contexte possédant des enfants dynamiques, il peut s'avérer utile d'itérer ces enfants par programmation. Ceci peut être réalisé à l'aide de la fonction list, qui renvoie un tableau d'enfants dynamiques. Le script ci-dessous itère par exemple chaque partage de chaque projet et imprime la quantité d'espace occupée et la quantité d'espace disponible :
script run('shares'); projects = list(); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); printf("%s/%s %1.64g %1.64g\n", projects[i], shares[j], get('space_data'), get('space_available')); run('cd ..'); } run('cd ..'); }
La sortie obtenue après l'exécution du script, enregistré dans le fichier "space.aksh", est présentée ci-dessous :
% ssh root@koi < space.aksh Password: admin/accounts 18432 266617007104 admin/exports 18432 266617007104 admin/primary 18432 266617007104 admin/traffic 18432 266617007104 admin/workflow 18432 266617007104 aleventhal/hw_eng 18432 266617007104 bcantrill/analytx 1073964032 266617007104 bgregg/dashbd 18432 266617007104 bgregg/filesys01 26112 107374156288 bpijewski/access_ctrl 18432 266617007104 ...
Pour obtenir une version plus "présentable" (bien que plus difficile à gérer du point de vue de la programmation), il est possible d'analyser directement la sortie de la commande get :
script run('shares'); projects = list(); printf('%-40s %-10s %-10s\n', 'SHARE', 'USED', 'AVAILABLE'); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); share = projects[i] + '/' + shares[j]; used = run('get space_data').split(/\s+/)[3]; avail = run('get space_available').split(/\s+/)[3]; printf('%-40s %-10s %-10s\n', share, used, avail); run('cd ..'); } run('cd ..'); }
Un extrait de la sortie obtenue après l'exécution de ce nouveau script, enregistré dans le fichier "prettyspace.aksh", est présenté ci-dessous :
% ssh root@koi < prettyspace.aksh Password: SHARE USED AVAILABLE admin/accounts 18K 248G admin/exports 18K 248G admin/primary 18K 248G admin/traffic 18K 248G admin/workflow 18K 248G aleventhal/hw_eng 18K 248G bcantrill/analytx 1.00G 248G bgregg/dashbd 18K 248G bgregg/filesys01 25.5K 100G bpijewski/access_ctrl 18K 248G ...
Même dans un contexte possédant des enfants statiques, il peut s'avérer utile d'itérer ces enfants par programmation. Ceci peut être réalisé à l'aide de la fonction children, qui renvoie un tableau d'enfants statiques. Voici par exemple un script qui itère chaque service et imprime le statut du service :
configuration services script var svcs = children(); for (var i = 0; i < svcs.length; ++i) { run(svcs[i]); try { printf("%-10s %s\n", svcs[i], get('<status>')); } catch (err) { } run("done"); }
La sortie obtenue après l'exécution du script, enregistré dans le fichier "svcinfo.aksh", est présentée ci-dessous :
% ssh root@koi < space.aksh Password: cifs disabled dns online ftp disabled http disabled identity online idmap online ipmp online iscsi online ldap disabled ndmp online nfs online nis online ntp online scrk online sftp disabled smtp online snmp disabled ssh online tags online vscan disabled
La fonction Choices retourne une série de valeurs de la propriété valide pour toute propriété dont l'ensemble de valeurs est connu et énumérable. Par exemple, le script suivant extrait la liste de tous les pools sur le noeud de partage à l'aide de la fonction Choices, puis itère tous les pools pour répertorier les projets et les partages ainsi que l'espace disponible.
fmt = '%-40s %-15s %-15s\n'; printf(fmt, 'SHARE', 'USED', 'AVAILABLE'); run('cd /'); run('shares'); pools = choices('pool'); for (p = 0; p < pools.length; p++) { set('pool', pools[p]); projects = list(); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); share = pools[p] + ':' + projects[i] + '/' + shares[j]; printf(fmt, share, get('space_data'), get('space_available')); run('cd ..'); } run('cd ..'); } }
La sortie obtenue après l'exécution du script est présentée ci-dessous :
SHARE USED AVAILABLE pond:projectA/fs1 31744 566196178944 pond:projectA/fs2 31744 566196178944 pond:projectB/lun1 21474836480 587670999040 puddle:deptA/share1 238475 467539219283 puddle:deptB/share1 129564 467539219283 puddle:deptB/share2 19283747 467539219283