Managing compute users
When someone asks for more information, or to access CALC@HEI
When a user contact us to ask for access, we give the documentation link first : (TODO : This would be later the portal page)
Here is an email template, we can add Pierre André in CC
Subject : Demande d'accès à CALC@HEI
Bonjour x,
Merci pour ton message et pour ton intérêt pour CALC@HEI, l'infrastructure de calcul pour la recherche : pour faire ta demande d'accès, tu as juste un formulaire à remplir et tout est expliqué içi : CALC@HEI
Si tu as des questions, n'hésites pas à venir nous voir ou nous appeler directement.
Bien cordialement,
(signature)
Subject : CALC@HEI access
Hello x,
Welcome to CALC@HEI, the HEI research computing infrastructure !
Your access is ready : we invite you to read our documentation to run jobs on our infrastructure
If you have any question or see anything missing in the documentation, don't hesitate to contact us so we can fix that.
About the budget on infrastructure, I let you discuss with Pierre-André.
Best regards,
( signature)
Get info from the online form
Check first that everything looks fine from the technical perspective regarding the incoming project.
Prepare :
- username : firstname.lastname (generally the part in front of the @hevs.ch email address should be fine)
- SSH public key
- Project name
Prepare playbook
Linux accounts, UID/GID and SSH keys for Chacha/Disco are managed by
Ansible, not by a script in this directory — see
Ansible for the full picture and the known gap
(conf/users/*.yml UIDs can disagree with what's live; check getent passwd
on a real node before trusting the YAML).
Check uid/gid to assign
Add the first available uid/gid to provisioning/ansible/conf/users/uid-others.yml
(the dance_uids cohort in conf/users/roles.yml, covering Chacha/Disco/Tango).
cd provisioning/ansible/conf/users/
vim uid-others.yml
uid_others:
- { id: '25506', name: 'urs.mueller', shell: '/bin/bash', email: 'Urs Mueller <urs.mueller@hevs.ch>' }
NOTE : double check you correctly took an id not already assigned, no error control here.
Add SSH key
Add the public key from the form as
provisioning/ansible/conf/authorized_keys/urs.mueller.pub — that directory
is the source of truth for SSH access across the whole fleet, including
Chacha/Disco.
Apply the Ansible playbook
From provisioning/ansible/:
ansible-playbook users.yml -e 'h=dance'
This creates the Linux account (with the UID from conf/users/), deploys
the SSH key, and sets up the apptainer/dataset/results/shared_datasets
directories and symlinks — see the Ansible doc for
setup (setup.cfg, vault password) if this is the first run.
Configure SLURM account
Accounts and users are declared in provisioning/accounts.yaml and
applied with provisioning/slurm/provision.py, run from Chacha (it owns
slurmdbd). See SLURM configuration for how
the tiers/QOS mapping works.
-
If it's a new project, add it under
groups:with thetiermatching the SLA from the form (premium_rsorstandard_rs). -
Add the user under
users::usernamegroup: the project name from step 1 (or an existing group, orstudents)partition:dancefor the whole cluster, orchacha/discofor just one server
- username: urs.muellergroup: ProjectNamepartition: dance -
Apply it from
provisioning/slurm/(it reads../accounts.yaml):./provision.py --validate # structure check, no cluster access needed./provision.py # dry run — prints the sacctmgr commands./provision.py --apply # actually creates the account/user--applyonly ever adds what's missing; it never touches an existing association's limits — that's what--checkreports, for a human to decide on.
Configure quotas
Run the script from Disco first, then Chacha : **add_quota.sh **
With :
- username
- hard limits quota for /, /data, and /data/shared
./add_quota.sh urs.mueller 20G 100G 100G
**NOTE: ** For students, quota on root filesystem should be 10G to make them learn to really pay attention to where the put their images / containers / datasets. For researchers it is 20G to allow quick testing as long as they don't cumulate containers in their home without cleaning
Send an email to the user
Using this template, and by adding Pierre André in CC :
** Subject : ** Accès à CALC@HEI
Bonjour x,
Bienvenue sur CALC@HEI, l'infrastructure de calcul pour la recherche !
Ton accès vient d'être créé : nous t'invitons à lire notre documentation pour pouvoir lancer des jobs sur notre infrastructure.
Si tu as des questions ou si tu vois une information qui manque dans la documentation, n'hésites pas à nous contacter pour qu'on puisse résoudre ça.
Bien cordialement,
(signature)
How to remove a user
Offboarding revokes access but doesn't delete data — home dir, datasets and apptainer cache are left in place so a deliberate retention decision can be made separately, later.
-
Revoke SSH/login access. Run from Disco, then Chacha :
remove_sshuser.sh./remove_sshuser.sh urs.muellerThis locks the account (
usermod -L, shell →/usr/sbin/nologin) and moves the SSH key aside on the user's~/.ssh/authorized_keys.Also remove the user from the Ansible roster — delete their entry from
provisioning/ansible/conf/users/uid-others.yml(or whichever cohort file they're in) and their key fromprovisioning/ansible/conf/authorized_keys/urs.mueller.pub. Ansible only creates/converges towards present state — it has no removal logic — so the nextansible-playbook users.yml -e 'h=dance'run would otherwise silently reset the shell back to/bin/bashand re-add the SSH key, undoing this step. -
Reset quotas so the account no longer counts against the shared filesystems, run from Disco then Chacha : add_quota.sh
./add_quota.sh urs.mueller 0M 0M 0M -
Remove the SLURM user. Delete the user's whole entry from
provisioning/accounts.yaml, then fromprovisioning/slurm/:./provision.py --prune # dry run — prints the sacctmgr commands./provision.py --prune --apply # actually removes the associationSee SLURM configuration. If the user was the last member of a project account, deciding whether to also remove that account is a separate judgment call —
--pruneonly ever removes users. -
Check for extras that aren't part of standard onboarding and clean up if present: a group symlink at
/home/urs.mueller/group(add_group.sh). Note the generic CIFS-mount sudoers rule Ansible applies to every user (/etc/sudoers.d/ursmueller) isn't cleaned up by locking the account — it becomes moot once the account itself is locked and removed from the Ansible roster (step 1). -
Data retention. Home dir, datasets and apptainer cache are intentionally left untouched by the steps above. Archiving or deleting them is a separate decision — check with the user/PI before removing anything.