diff --git a/CICD/plays/allnodes.yml b/CICD/plays/allnodes.yml
index aef58338e152562101e7612ba95bc42410bec087..d6b0cf810216d55727fdbddf79745e98ad482e9f 100644
--- a/CICD/plays/allnodes.yml
+++ b/CICD/plays/allnodes.yml
@@ -4,6 +4,7 @@
     #  - vars/ldapConfig.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   tasks:
   - { name: set use shared state, set_fact: usesharedstatedir=False }
   - { name: set hostgroup, set_fact: hostgroup='ComputeNodes' }
@@ -14,6 +15,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   - vars/vars_centos79.yml
   strategy: free
   roles:
@@ -28,6 +30,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   strategy: free
   roles:
   - { role: disable_selinux, tags: [ disableselinux ] }
diff --git a/CICD/plays/computenodes.yml b/CICD/plays/computenodes.yml
index ae9fd61f1ce6ff7d1d05b8e9a0d83c694dd75680..1d83c1dfb0800b673eeaf1336717b0890c755ebc 100644
--- a/CICD/plays/computenodes.yml
+++ b/CICD/plays/computenodes.yml
@@ -5,10 +5,12 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   tasks:
   - include_vars: vars/passwords.yml
   - include_vars: vars/slurm.yml
   - include_vars: vars/vars.yml
+  - include_vars: vars/versions.yml
   #- include_vars: vars/c7packages.yml
   - { name: set use shared state, set_fact: usesharedstatedir=False }
   tags: [ always ]
@@ -19,6 +21,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   strategy: free
   roles:
   - { role: move_homedir, tags: [ authentication, filesystems ] }
@@ -37,6 +40,7 @@
   gather_facts: False
   vars_files:
   - vars/vars.yml
+  - vars/versions.yml
   roles:
   - { role: gpu, tags: [ gpu ] }
 
@@ -46,6 +50,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   roles:
   - { role: slurm_config, tags: [slurm, slurm_config] }
 
diff --git a/CICD/plays/mgmtnodes.yml b/CICD/plays/mgmtnodes.yml
index 3f915a583ec64d8f502d90ddba8b055e1f2ad151..50780e2dec5d1961431c999714b0b952b5be67a4 100644
--- a/CICD/plays/mgmtnodes.yml
+++ b/CICD/plays/mgmtnodes.yml
@@ -9,6 +9,7 @@
   - vars/slurm.yml
   - vars/vars.yml
   - vars/vars_centos79.yml
+  - vars/versions.yml
   tasks:
   - { name: unmount vdb if absent,  mount: { path: "/mnt", src: "/dev/vdb", state: absent},
       when: 'hostvars[inventory_hostname]["ansible_devices"]["vdb"] is not defined', become: true }
@@ -23,6 +24,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   roles:
 #  - { role: ldapclient, tags: [ authentication ] }
 #  - { role: ssh-password-login }
diff --git a/CICD/plays/nfssqlnodes.yml b/CICD/plays/nfssqlnodes.yml
index 72d2d18181e2ad7f39c0f51c02d26e952a593ce3..9c123ca6bcd3567698b3d515a628ae85c0dce899 100644
--- a/CICD/plays/nfssqlnodes.yml
+++ b/CICD/plays/nfssqlnodes.yml
@@ -14,6 +14,7 @@
   - include_vars: vars/passwords.yml
   - include_vars: vars/slurm.yml
   - include_vars: vars/vars.yml
+  - include_vars: vars/versions.yml
   - include_vars: vars/vars_centos79.yml
   - { name: set hostgroup, set_fact: hostgroup='ManagementNodes' }
   - { name: set use shared state, set_fact: usesharedstatedir=True }
@@ -24,6 +25,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   pre_tasks:
   - { name: set hostgroup, set_fact: hostgroup='SQLNodes', tags: [ always ] }
   - { name: set use shared state, set_fact: usesharedstatedir=True, tags: [ always ] }
@@ -33,6 +35,7 @@
   - vars/passwords.yml
   - vars/slurm.yml
   - vars/vars.yml
+  - vars/versions.yml
   - vars/vars_centos79.yml
   strategy: free
   gather_facts: True
diff --git a/CICD/vars/versions.yml b/CICD/vars/versions.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8251f7fb436598f75e118085986079e820fe2ae8
--- /dev/null
+++ b/CICD/vars/versions.yml
@@ -0,0 +1,23 @@
+nhc_version: 1.4.2
+nhc_src_url: https://codeload.github.com/mej/nhc/tar.gz/refs/tags/1.4.2
+nhc_src_checksum: "sha1:766762d2c8cd81204b92d4921fb5b66616351412"
+nhc_src_dir: /opt/src/nhc-1.4.2
+nhc_dir: /opt/nhc-1.4.2
+
+slurm_version: 20.02.6
+slurm_src_url: https://github.com/SchedMD/slurm/archive/refs/tags/slurm-20-02-6-1.tar.gz
+slurm_src_checksum: "sha1:99f635b528ce120f10efd432019b3b7270a0f9b3"
+slurm_src_dir: /opt/src/slurm-slurm-20-02-6-1
+slurm_dir: /opt/slurm-20.02.6
+
+ucx_version: 1.8.0
+ucx_src_url: https://github.com/openucx/ucx/releases/download/v1.8.0/ucx-1.8.0.tar.gz
+ucx_src_checksum: "sha1:96f2fe1918127edadcf5b195b6532da1da3a74fa"
+ucx_src_dir: /opt/src/ucx-1.8.0
+ucx_dir: /opt/ucx-1.8.0
+
+munge_version: 0.5.14
+munge_src_url: https://github.com/dun/munge/archive/refs/tags/munge-0.5.14.tar.gz
+munge_src_checksum: "sha1:70f6062b696c6d4f17b1d3bdc47c3f5eca24757c"
+munge_dir: /opt/munge-0.5.14
+munge_src_dir: /opt/src/munge-munge-0.5.14
diff --git a/roles/mysql/vars/Ubuntu_20.yml~ b/roles/mysql/vars/Ubuntu_20.yml~
new file mode 100644
index 0000000000000000000000000000000000000000..26aabeb9dda2463930a2b26fb8c9bcdf1307eab5
--- /dev/null
+++ b/roles/mysql/vars/Ubuntu_20.yml~
@@ -0,0 +1,17 @@
+server_packages:
+ - python
+ - python-dev
+ - libmariadb-dev
+ - python3-pip
+ - libapache2-mod-wsgi
+ - python3-mysql.connector
+ - mariadb-server
+ - python3-mysqldb
+ - python3-pymysql
+
+client_packages:
+ - python3
+ - python3-pymysql
+ - mariadb-client
+
+sqlServiceName: "mariadb"
diff --git a/roles/nhc/tasks/main.yml b/roles/nhc/tasks/main.yml
index 54e81b60b09988293455207727b07bda4367c5a8..f254a27e69b402b72a959870afd7be85bd7dc977 100644
--- a/roles/nhc/tasks/main.yml
+++ b/roles/nhc/tasks/main.yml
@@ -24,21 +24,21 @@
   get_url:
     url: "{{ nhc_src_url }}"
     checksum: "{{ nhc_src_checksum }}"
-    dest: "{{ src_base }}/nhc.tar.gz"
+    dest: "{{ nhc_src_dir | dirname }}/nhc.tar.gz"
   when: nhc_src_checksum is defined
 
 - name: download nhc
   get_url:
     url: "{{ nhc_src_url }}"
-    dest: "{{ src_base }}/nhc.tar.gz"
+    dest: "{{ nhc_src_dir | dirname }}/nhc.tar.gz"
   when: nhc_src_checksum is not defined
     
 - name: unarchive nhc
   unarchive:
   args:
-    src: "{{ src_base }}/nhc.tar.gz"
+    src: "{{ nhc_src_dir | dirname}}/nhc.tar.gz"
     copy: no
-    dest: "{{ src_base }}"
+    dest: "{{ nhc_src_dir | dirname }}"
     creates: "{{ nhc_src_dir }}/autogen.sh"
   when: not nhc_binary.stat.exists
 
diff --git a/roles/nhc/tasks/main.yml~ b/roles/nhc/tasks/main.yml~
new file mode 100644
index 0000000000000000000000000000000000000000..54e81b60b09988293455207727b07bda4367c5a8
--- /dev/null
+++ b/roles/nhc/tasks/main.yml~
@@ -0,0 +1,91 @@
+---
+- name: define nhc_src_url
+  set_fact:
+    nhc_src_url: "http://consistency0/src/{{ nhc_version }}.tar.gz"
+  when: nhc_src_url is not defined
+
+- name: check existing installation
+  stat: path="{{ nhc_dir }}/sbin/nhc"
+  register: nhc_binary
+
+- name: install automake
+  yum: name=automake state=present
+  become: true
+  become_user: root
+  when: ansible_os_family=='RedHat'
+
+- name: install automake
+  apt: name=automake state=present
+  become: true
+  become_user: root
+  when: ansible_os_family=='Debian'
+
+- name: download nhc
+  get_url:
+    url: "{{ nhc_src_url }}"
+    checksum: "{{ nhc_src_checksum }}"
+    dest: "{{ src_base }}/nhc.tar.gz"
+  when: nhc_src_checksum is defined
+
+- name: download nhc
+  get_url:
+    url: "{{ nhc_src_url }}"
+    dest: "{{ src_base }}/nhc.tar.gz"
+  when: nhc_src_checksum is not defined
+    
+- name: unarchive nhc
+  unarchive:
+  args:
+    src: "{{ src_base }}/nhc.tar.gz"
+    copy: no
+    dest: "{{ src_base }}"
+    creates: "{{ nhc_src_dir }}/autogen.sh"
+  when: not nhc_binary.stat.exists
+
+- name: build nhc
+  shell: ./autogen.sh && ./configure --prefix={{ nhc_dir }} && make
+  args:
+    chdir: "{{ nhc_src_dir }}"
+    creates: "{{ nhc_src_dir }}/configure"
+  when: not nhc_binary.stat.exists
+
+- name: install nhc
+  shell: make install
+  become: true
+  args:
+      chdir: "{{ nhc_src_dir }}"
+  when: not nhc_binary.stat.exists
+
+- name: ensure sysconfig dir exists
+  file: dest=/etc/sysconfig state=directory owner=root group=root mode=755
+  become: true
+
+- name: copy nhc sysconfig script
+  template: dest=/etc/sysconfig/nhc src=nhc.sysconfig.j2 mode=644
+  become: true
+
+- name: copy nhc log rotate script
+  template: dest=/etc/logrotate.d/nhc src=nhclog.j2 mode=644
+  become: true
+
+- name: install nhc config file
+  copy: src=nhc.conf dest={{ nhc_dir }}/etc/nhc/{{ nhc_config_file }}
+  become: true
+  become_user: root
+
+- name: install nhc scripts
+  copy: src=scripts/ dest={{ nhc_dir }}/etc/nhc/scripts/
+  become: true
+  become_user: root
+
+#test NAT is working by pinging an external address, i.e. a license server, or by default Google Public DNS
+- set_fact:
+    EXTERNAL_IP_ADDRESS: "8.8.8.8"
+  when: EXTERNAL_IP_ADDRESS is undefined
+
+- name: install nhc NAT check
+  template: dest="{{ nhc_dir }}/etc/nhc/scripts/check_nat.nhc" src=check_nat.nhc.j2
+  become: true
+  become_user: root
+  when: ADD_NHC_NAT_CHECK is defined
+
diff --git a/roles/slurm-common/tasks/installMungeFromSource.yml b/roles/slurm-common/tasks/installMungeFromSource.yml
index 696031785033c7144fc7ee926d5203a15b3c4b77..16383cd5c46cffe726a7a53edf909e1033c00987 100644
--- a/roles/slurm-common/tasks/installMungeFromSource.yml
+++ b/roles/slurm-common/tasks/installMungeFromSource.yml
@@ -2,6 +2,16 @@
   stat: path="{{ munge_dir }}/bin/munge"
   register: munge_binary
 
+- name: Create munge directory if it does not exist
+  file:
+    path: "{{ munge_src_dir | dirname }}"
+    state: directory
+    owner: "{{ ansible_user }}"
+    group: root
+    mode: u=rwx,g=rx,o=rx
+  become: true
+
+
 - name: define munge_src_url
   set_fact:
     munge_src_url: "http://consistency0/src/munge-{{ munge_version }}.tar.bz2"
@@ -11,25 +21,25 @@
   get_url:
     url: "{{ munge_src_url }}"
     checksum: "{{ munge_src_checksum }}"
-    dest: "{{ src_base }}/munge_src"
+    dest: "{{ munge_src_dir | dirname }}/munge_src"
   when: munge_src_checksum is defined
 - name: download munge
   get_url:
     url: "{{ munge_src_url }}"
-    dest: "{{ src_base }}/munge_src"
+    dest: "{{ munge_src_dir | dirname }}/munge_src"
   when: munge_src_checksum is not defined
 
 
 - name: unarchive munge
   unarchive:
-    src: "{{ src_base }}/munge_src"
-    dest: "{{ src_base }}"
+    src: "{{ munge_src_dir | dirname }}/munge_src"
+    dest: "{{ munge_src_dir | dirname }}"
     remote_src: yes
     creates: "{{ munge_src_dir }}"
 
 
 - name: build munge
-  shell: ./configure --prefix={{ munge_dir }} && make
+  shell: ./bootstrap && ./configure --prefix={{ munge_dir }} && make
   args:
     chdir: "{{ munge_src_dir }}"
     creates: "{{ munge_src_dir }}/src/munge/munge"
diff --git a/roles/slurm-common/tasks/installMungeFromSource.yml~ b/roles/slurm-common/tasks/installMungeFromSource.yml~
new file mode 100644
index 0000000000000000000000000000000000000000..9d3b973d81778515a4b3a5c03b3d4fda161df75e
--- /dev/null
+++ b/roles/slurm-common/tasks/installMungeFromSource.yml~
@@ -0,0 +1,80 @@
+- name: test if munge is already isntalled
+  stat: path="{{ munge_dir }}/bin/munge"
+  register: munge_binary
+
+- name: Create munge directory if it does not exist
+  file:
+    path: "{{ munge_src_dir | dirname }}"
+    state: directory
+    owner: "{{ ansible_user }}"
+    group: root
+    mode: u=rwx,g=rx,o=rx
+  become: true
+
+
+- name: define munge_src_url
+  set_fact:
+    munge_src_url: "http://consistency0/src/munge-{{ munge_version }}.tar.bz2"
+  when: munge_src_url is not defined
+
+- name: download munge
+  get_url:
+    url: "{{ munge_src_url }}"
+    checksum: "{{ munge_src_checksum }}"
+    dest: "{{ munge_src_dir | dirname }}/munge_src"
+  when: munge_src_checksum is defined
+- name: download munge
+  get_url:
+    url: "{{ munge_src_url }}"
+    dest: "{{ munge_src_dir | dirname }}/munge_src"
+  when: munge_src_checksum is not defined
+
+
+- name: unarchive munge
+  unarchive:
+    src: "{{ munge_src_dir | dirname }}/munge_src"
+    dest: "{{ munge_src_dir | dirname }}"
+    remote_src: yes
+    creates: "{{ munge_src_dir }}"
+
+
+- name: build munge
+  shell: ./bootstrap ; ./configure --prefix={{ munge_dir }} && make
+  args:
+    chdir: "{{ munge_src_dir }}"
+    creates: "{{ munge_src_dir }}/src/munge/munge"
+  when: not munge_binary.stat.exists
+
+- name: install munge
+  shell: make install
+  become: true
+  args:
+    chdir: "{{ munge_src_dir }}"
+    creates: "{{ munge_dir }}/bin/munge"
+  when: not munge_binary.stat.exists
+
+- name: set use_systemd Redhat
+  set_fact:
+    use_systemd: True
+  when: (ansible_distribution == "CentOS" or ansible_distribution == "RedHat") and ( ansible_distribution_major_version == "7")
+
+- name: set use_systemd Debian
+  set_fact:
+    use_systemd: True
+  when: ansible_os_family == "Debian"
+
+- name: copy init script
+  template: dest=/etc/init.d/munge src=munge.initd.j2 mode=755
+  become: true
+  register: systemd_script_installed
+  when: use_systemd is not defined
+
+- name:  copy slurm init script if OS contains systemd
+  template: dest=/etc/systemd/system/munge.service src=munge.service.j2 mode=644
+  become: true
+  when: use_systemd is defined
+
+- name: reload systemd
+  shell: systemctl daemon-reload
+  become: true
+  when: use_systemd is defined and systemd_script_installed.changed
diff --git a/roles/slurm-common/tasks/installSlurmFromSource.yml b/roles/slurm-common/tasks/installSlurmFromSource.yml
index 1754c3c312fa8d1e5a1a7cc58ee26c31e99a5e08..43a744bd2099874b1e2f0568243f2243130052e3 100644
--- a/roles/slurm-common/tasks/installSlurmFromSource.yml
+++ b/roles/slurm-common/tasks/installSlurmFromSource.yml
@@ -10,7 +10,7 @@
 
 - name: Create ucx directory if it does not exist
   file:
-    path: "{{ src_base }}"
+    path: "{{ ucx_src_dir | dirname }}"
     state: directory
     owner: "{{ ansible_user }}"
     group: root
@@ -35,18 +35,18 @@
   get_url:
     url: "{{ slurm_src_url }}"
     checksum: "{{ slurm_src_checksum }}"
-    dest: "{{ src_base }}/slurm_src"
+    dest: "{{ slurm_src_dir | dirname }}/slurm_src"
   when: slurm_src_checksum is defined
 - name: download slurm
   get_url:
     url: "{{ slurm_src_url }}"
-    dest: "{{ src_base }}/slurm_src"
+    dest: "{{ slurm_src_dir | dirname }}/slurm_src"
   when: slurm_src_checksum is not defined
     
 - name: unarchive slurm
   unarchive:
-    src: "{{ src_base }}/slurm_src"
-    dest: "{{ src_base }}"
+    src: "{{ slurm_src_dir | dirname }}/slurm_src"
+    dest: "{{ slurm_src_dir | dirname }}"
     remote_src: yes
     creates: "{{ slurm_src_dir }}"
 
@@ -73,20 +73,20 @@
   get_url:
     url: "{{ ucx_src_url }}"
     checksum: "{{ ucx_src_checksum }}"
-    dest: "{{ src_base }}/ucx_src"
+    dest: "{{ ucx_src_dir | dirname }}/ucx_src"
   when: ucx_src_checksum is defined
 - name: download ucx
   get_url:
     url: "{{ ucx_src_url }}"
-    dest: "{{ src_base }}/ucx_src"
+    dest: "{{ ucx_src_dir | dirname }}/ucx_src"
   when: ucx_src_checksum is not defined
     
 - name: unarchive ucx
   unarchive:
   args:
-    src: "{{ src_base }}/ucx_src"
+    src: "{{ ucx_src_dir | dirname }}/ucx_src"
     copy: no
-    dest: "{{ src_base }}"
+    dest: "{{ ucx_src_dir | dirname }}"
     creates: "{{ ucx_src_dir }}"
   become: true
   register: newucx
diff --git a/roles/slurm-common/tasks/installSlurmFromSource.yml~ b/roles/slurm-common/tasks/installSlurmFromSource.yml~
new file mode 100644
index 0000000000000000000000000000000000000000..1754c3c312fa8d1e5a1a7cc58ee26c31e99a5e08
--- /dev/null
+++ b/roles/slurm-common/tasks/installSlurmFromSource.yml~
@@ -0,0 +1,171 @@
+- name: define ucx_src_url
+  set_fact:
+    ucx_src_url: "http://consistency0/src/ucx_1_8_0.tar.gz"
+  when: ucx_src_url is not defined
+
+- name: define slurm_src_url
+  set_fact:
+    slurm_src_url: "http://consistency0/src/slurm-{{ slurm_version }}.tar.bz2"
+  when: slurm_src_url is not defined
+
+- name: Create ucx directory if it does not exist
+  file:
+    path: "{{ src_base }}"
+    state: directory
+    owner: "{{ ansible_user }}"
+    group: root
+    mode: u=rwx,g=rx,o=rx
+  become: true
+
+- name: remove all install
+  file:
+    path: "{{ slurm_src_dir }}"
+    state: absent
+  become: true
+  when: force_slurm_recompile is defined
+
+- name: remove all install
+  file:
+    path: "{{ slurm_dir }}"
+    state: absent
+  become: true
+  when: force_slurm_recompile is defined
+
+- name: download slurm
+  get_url:
+    url: "{{ slurm_src_url }}"
+    checksum: "{{ slurm_src_checksum }}"
+    dest: "{{ src_base }}/slurm_src"
+  when: slurm_src_checksum is defined
+- name: download slurm
+  get_url:
+    url: "{{ slurm_src_url }}"
+    dest: "{{ src_base }}/slurm_src"
+  when: slurm_src_checksum is not defined
+    
+- name: unarchive slurm
+  unarchive:
+    src: "{{ src_base }}/slurm_src"
+    dest: "{{ src_base }}"
+    remote_src: yes
+    creates: "{{ slurm_src_dir }}"
+
+- name: stat srun
+  stat: path="{{ slurm_dir }}/bin/srun"
+  register: stat_srun
+
+- name: stat ucx
+  stat: 
+    path: "{{ ucx_dir }}"
+  register: stat_ucx
+
+- name: Create ucx directory if it does not exist
+  file:
+    path: "{{ ucx_dir }}"
+    state: directory
+    owner: root
+    group: root
+    mode: u=rwx,g=rx,o=rx
+  become: true
+  when: not stat_ucx.stat.exists
+
+- name: download ucx
+  get_url:
+    url: "{{ ucx_src_url }}"
+    checksum: "{{ ucx_src_checksum }}"
+    dest: "{{ src_base }}/ucx_src"
+  when: ucx_src_checksum is defined
+- name: download ucx
+  get_url:
+    url: "{{ ucx_src_url }}"
+    dest: "{{ src_base }}/ucx_src"
+  when: ucx_src_checksum is not defined
+    
+- name: unarchive ucx
+  unarchive:
+  args:
+    src: "{{ src_base }}/ucx_src"
+    copy: no
+    dest: "{{ src_base }}"
+    creates: "{{ ucx_src_dir }}"
+  become: true
+  register: newucx
+
+- name: install ucx
+  shell: "./contrib/configure-release --prefix={{ ucx_dir }} && make -j8 && make install"
+  args:
+    chdir: "{{ ucx_src_dir }}"
+    creates: "{{ ucx_dir }}/bin/ucx_info"
+  become: true
+    #  when: not stat_ucx.stat.exists
+
+- name: configure slurm centos
+  command: "{{ slurm_src_dir }}/configure --prefix={{ slurm_dir }} --with-munge={{ munge_dir }} --enable-pam --with-pmix={{ pmix_dir }} --with-ucx={{ ucx_dir }}"
+  args:
+    creates: "{{ slurm_dir }}/bin/srun"
+    chdir: "{{ slurm_src_dir }}"
+  when:
+    - force_slurm_recompile is defined or not stat_srun.stat.exists
+    - ansible_os_family == 'RedHat'
+
+- name: configure slurm ubuntu
+  command: "{{ slurm_src_dir }}/configure --prefix={{ slurm_dir }} --with-munge={{ munge_dir }} --enable-pam --with-pmix --with-ucx={{ ucx_dir }}"
+  args:
+    creates: "{{ slurm_dir }}/bin/srun"
+    chdir: "{{ slurm_src_dir }}"
+  when:
+    - force_slurm_recompile is defined or not stat_srun.stat.exists
+    - ansible_os_family == 'Debian'
+
+- name: build slurm
+  command: make
+  args:
+    creates: "{{ slurm_dir }}/bin/srun"
+    chdir: "{{ slurm_src_dir }}"
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+
+- name: install slurm
+  shell: make install
+  become: true
+  args:
+    chdir: "{{ slurm_src_dir }}"
+    creates: "{{ slurm_dir }}/bin/srun"
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+
+- name: build pam_slurm
+  shell: "make && make install"
+  args:
+    chdir: "{{ slurm_src_dir }}/contribs/pam"
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+  become: true
+
+- name: build pam_slurm_adopt
+  make:
+    chdir: "{{ slurm_src_dir }}/contribs/pam_slurm_adopt"
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+
+- name: install pam_slurm_adopt
+  make:
+    chdir: "{{ slurm_src_dir }}/contribs/pam_slurm_adopt"
+    target: install
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+  become: true
+
+- name: remove exist-slurm-latest-link
+  file:
+    path: /opt/slurm-latest
+    state: absent
+  become: true
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+
+- name: put slurm-latest-link
+  file:
+    src: "{{ slurm_dir }}"
+    dest: /opt/slurm-latest
+    state: link
+  become: true
+  when: force_slurm_recompile is defined or not stat_srun.stat.exists
+
+- name: add slurm log rotate config
+  template: src=slurmlog.j2 dest=/etc/logrotate.d/slurm mode=644
+  become: true