Migrate the role

This commit is contained in:
Alexander Gorelyshev
2026-05-19 15:05:14 +04:00
parent fd6e2517a3
commit f706aa0f38
13 changed files with 336 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
---
- name: "Download miniforge from '{{ miniforge_release_base_url }}'"
retries: 3
delay: 1
ansible.builtin.get_url:
timeout: 10
url: "{{ miniforge_release_base_url }}/{{ miniforge_release }}/{{ miniforge_install_script_name }}.sh"
dest: "{{ miniforge_script_path }}"
mode: "0664"
- name: "Deploy Mamba in a user loop"
loop: "{{ miniforge_users }}"
loop_control:
loop_var: user
ansible.builtin.include_tasks: "miniforge.yml"

View File

@@ -0,0 +1,24 @@
---
- name: "Get contents of the manifest file"
register: miniforge_manifest_content
ansible.builtin.slurp:
src: "{{ miniforge_homedir }}/{{ file }}"
# Since the file can be named whatever, we need to extract the environment name
# as that is what the actual environment folder name will be
- name: "Extract enviroment name from manifest file"
ansible.builtin.set_fact:
miniforge_env_name: '{{ (miniforge_manifest_content.content | b64decode | from_yaml).name }}'
- name: "Display the extracted environment name"
ansible.builtin.debug:
msg: "{{ miniforge_env_name }}"
- name: "Create environment: {{ miniforge_env_name }}"
become: true
become_user: "{{ user.name }}"
ansible.builtin.shell:
cmd: "{{ miniforge_homedir }}/miniforge3/bin/mamba env create -f {{ miniforge_homedir }}/{{ file }}"
executable: /bin/bash
# ensures that the task runs only when the environment doesn't exist
creates: "{{ miniforge_homedir }}/miniforge3/envs/{{ miniforge_env_name }}"

View File

@@ -0,0 +1,101 @@
---
# These variables are registered as host vars, for whatever deep reason
- name: "Get current user entity info ({{ user.name }})"
ansible.builtin.getent:
database: passwd
key: "{{ user.name }}"
split: ":"
- name: "Get current user home directory ({{ user.name }})"
ansible.builtin.set_fact:
miniforge_homedir: "{{ getent_passwd[user.name][4] }}"
- name: "Set miniforge dir ({{ user.name }})"
ansible.builtin.set_fact:
miniforge_dir: "{{ miniforge_homedir }}/miniforge3"
- name: "Build miniforge bin path ({{ user.name }})"
ansible.builtin.set_fact:
miniforge_mamba_bin_path: "{{ miniforge_dir }}/bin/mamba"
- name: "Display miniforge script path ({{ user.name }})"
ansible.builtin.debug:
msg: "{{ miniforge_script_path }}"
- name: "Install miniforge ({{ user.name }})"
become: true
become_user: "{{ user.name }}"
vars:
allow_world_readable_tmpfiles: true
block:
- name: "Check Mamba availability ({{ user.name }})"
changed_when: false
ansible.builtin.command:
cmd: "{{ miniforge_mamba_bin_path }} info"
rescue:
- name: "Install miniforge in a non-interactive mode ({{ user.name }})"
ansible.builtin.command:
cmd: "/bin/bash {{ miniforge_script_path }} -b"
creates: "{{ miniforge_homedir }}/miniforge3"
- name: "Initialize Mamba/Conda ({{ user.name }})"
changed_when: false
ansible.builtin.command:
cmd: "{{ miniforge_mamba_bin_path }} init"
- name: "Check if Mamba has become available ({{ user.name }})"
changed_when: false
ansible.builtin.command:
cmd: "{{ miniforge_mamba_bin_path }} info"
- name: "Deploy default .condarc if it doesn't exist already ({{ user.name }})"
become: true
become_user: "{{ user.name }}"
block:
- name: "Check if .condarc already exists ({{ user.name }})"
register: miniforge_condarc_stat
failed_when: miniforge_condarc_stat.stat.exists is false
ansible.builtin.stat:
path: "{{ miniforge_homedir }}/.condarc"
rescue:
- name: "Set default .condarc from external file if provided ({{ user.name }})"
when: condarc_file is defined and condarc_file != ""
ansible.builtin.copy:
src: "{{ condarc_file }}"
dest: "{{ miniforge_homedir }}/.condarc"
mode: "0600"
- name: "Set default content via .condarc ({{ user.name }})"
when: condarc_file is not defined or condarc_file == ""
ansible.builtin.copy:
dest: "{{ miniforge_homedir }}/.condarc"
content: "{{ miniforge_condarc | to_nice_yaml }}"
mode: "0600"
- name: "Deploy manifest files for user: {{ user.name }}"
when:
- "manifest_dir is defined"
- "user.mamba_files is defined"
loop: "{{ user.mamba_files }}"
become: true
become_user: "{{ user.name }}"
ansible.builtin.copy:
src: "{{ manifest_dir }}/{{ item }}"
dest: "{{ miniforge_homedir }}/{{ item }}"
owner: "{{ user.name }}"
group: "{{ user.name }}"
mode: "0660"
# Variables from the outer scope (like 'user') will get passed down to the included tasks
- name: "Create environments from deployed manifests for user: {{ user.name }}"
when:
- "miniforge_create_envs is true"
- "user.mamba_files is defined"
loop: "{{ user.mamba_files }}"
loop_control:
loop_var: file
ansible.builtin.include_tasks: "manifests.yml"