diff --git a/roles/slurm/files/slurmctld.Dockerfile b/roles/slurm/files/slurmctld.Dockerfile index 34175d6..2d7a810 100644 --- a/roles/slurm/files/slurmctld.Dockerfile +++ b/roles/slurm/files/slurmctld.Dockerfile @@ -1,38 +1,11 @@ -FROM docker.io/library/centos:7 - -RUN yum install -y epel-release && \ - yum install -y slurm && \ - yum clean all && rm -rf /var/cache/yum - -RUN yum install -y less iproute bind-utils nmap-ncat net-tools && \ - yum clean all && rm -rf /var/cache/yum - -# FIXME -COPY entrypoint.sh /usr/local/sbin/entrypoint.sh - -RUN chown root:root /usr/local/sbin/entrypoint.sh && \ - chmod 755 /usr/local/sbin/entrypoint.sh - -ENTRYPOINT [ "/usr/local/sbin/entrypoint.sh" ] - -ARG slurmuser=slurm -ENV slurmuser=${slurmuser} - -RUN useradd -d /var/lib/slurm -m --no-log-init --system $slurmuser &&\ - slurm-setuser -u $slurmuser -g $slurmuser -y +FROM slurm:base RUN yum install -y slurm-slurmctld && \ yum clean all && rm -rf /var/cache/yum -COPY docker-init /usr/local/sbin/docker-init -RUN mkdir /etc/docker-init.d && chmod 755 /usr/local/sbin/docker-init -# FIXME -COPY start-scripts/10-munge /etc/docker-init.d/ -COPY start-scripts/20-slurmctld /etc/docker-init.d/ -RUN chmod 755 /etc/docker-init.d/* +COPY start-scripts/20-slurmctld /etc/docker-init.d/20-slurmctld +RUN chmod 755 /etc/docker-init.d/20-slurmctld ENV SLURMCTLD_LOG_PATH="/var/log/slurm/slurmctld.log" ENV SLURMD_LOG_PATH="/var/log/slurm/slurmd.log" ENV SLURM_SCHED_LOG_PATH="/var/log/slurm/slurmsched.log" - -CMD /usr/local/sbin/docker-init diff --git a/roles/slurm/files/slurmd.Dockerfile b/roles/slurm/files/slurmd.Dockerfile index 1e7883f..84e8dc2 100644 --- a/roles/slurm/files/slurmd.Dockerfile +++ b/roles/slurm/files/slurmd.Dockerfile @@ -1,38 +1,11 @@ -FROM docker.io/library/centos:7 - -RUN yum install -y epel-release && \ - yum install -y slurm && \ - yum clean all && rm -rf /var/cache/yum - -RUN yum install -y less iproute bind-utils nmap-ncat net-tools && \ - yum clean all && rm -rf /var/cache/yum - -# FIXME -COPY entrypoint.sh /usr/local/sbin/entrypoint.sh - -RUN chown root:root /usr/local/sbin/entrypoint.sh && \ - chmod 755 /usr/local/sbin/entrypoint.sh - -ENTRYPOINT [ "/usr/local/sbin/entrypoint.sh" ] - -ARG slurmuser=slurm -ENV slurmuser=${slurmuser} - -RUN useradd -d /var/lib/slurm -m --no-log-init --system $slurmuser &&\ - slurm-setuser -u $slurmuser -g $slurmuser -y +FROM slurm:base RUN yum install -y slurm-slurmd && \ yum clean all && rm -rf /var/cache/yum -COPY docker-init /usr/local/sbin/docker-init -RUN mkdir /etc/docker-init.d && chmod 755 /usr/local/sbin/docker-init -# FIXME -COPY start-scripts/10-munge /etc/docker-init.d/ -COPY start-scripts/30-slurmd /etc/docker-init.d/ -RUN chmod 755 /etc/docker-init.d/* +COPY start-scripts/30-slurmd /etc/docker-init.d/30-slurmd +RUN chmod 755 /etc/docker-init.d/30-slurmd ENV SLURMCTLD_LOG_PATH="/var/log/slurm/slurmctld.log" ENV SLURMD_LOG_PATH="/var/log/slurm/slurmd.log" ENV SLURM_SCHED_LOG_PATH="/var/log/slurm/slurmsched.log" - -CMD /usr/local/sbin/docker-init diff --git a/roles/slurm/tasks/main.yml b/roles/slurm/tasks/main.yml index 4d0d4b0..c893c5c 100644 --- a/roles/slurm/tasks/main.yml +++ b/roles/slurm/tasks/main.yml @@ -3,19 +3,24 @@ name: [ slurm, slurm-doc ] state: present -- include_tasks: dockerimage.yml +- include_role: + name: slurm_dockerimage loop: - name: slurmctld - start: - - 10-munge - - 20-slurmctld + dockerfile: "{{ lookup('file', 'slurmctld.Dockerfile') }}" + start_scripts: + - name: 20-slurmctld + content: "{{ lookup('file', 'start-scripts/20-slurmctld') }}" - name: slurmd - start: - - 10-munge - - 30-slurmd + dockerfile: "{{ lookup('file', 'slurmd.Dockerfile') }}" + start_scripts: + - name: 30-slurmd + content: "{{ lookup('file', 'start-scripts/30-slurmd') }}" loop_control: loop_var: image label: "{{ image.name }}" + vars: + build_base: True - name: generate munge key shell: @@ -78,6 +83,10 @@ image: slurm:slurmd extra_mounts: - "/home/{{unpriv_user}}/job3/:/mnt/:rw" +# - machine: slurm-cobald +# image: slurm-cobald +# extra_mounts: +# # TODO tags: [ slurm-config ] # TODO: reserve some address using docker_network_info and assign as aux diff --git a/roles/slurm_dockerimage/files/slurm-base.Dockerfile b/roles/slurm_dockerimage/files/slurm-base.Dockerfile new file mode 100644 index 0000000..c6f86df --- /dev/null +++ b/roles/slurm_dockerimage/files/slurm-base.Dockerfile @@ -0,0 +1,29 @@ +FROM docker.io/library/centos:7 + +RUN yum install -y epel-release && \ + yum install -y slurm && \ + yum clean all && rm -rf /var/cache/yum + +RUN yum install -y less iproute bind-utils nmap-ncat net-tools && \ + yum clean all && rm -rf /var/cache/yum + +# FIXME +COPY entrypoint.sh /usr/local/sbin/entrypoint.sh + +RUN chown root:root /usr/local/sbin/entrypoint.sh && \ + chmod 755 /usr/local/sbin/entrypoint.sh + +ENTRYPOINT [ "/usr/local/sbin/entrypoint.sh" ] + +ARG slurmuser=slurm +ENV slurmuser=${slurmuser} + +RUN useradd -d /var/lib/slurm -m --no-log-init --system $slurmuser &&\ + slurm-setuser -u $slurmuser -g $slurmuser -y + +COPY docker-init /usr/local/sbin/docker-init +RUN mkdir /etc/docker-init.d && chmod 755 /usr/local/sbin/docker-init +COPY start-scripts/10-munge /etc/docker-init.d/10-munge +RUN chmod 755 /etc/docker-init.d/10-munge + +CMD /usr/local/sbin/docker-init diff --git a/roles/slurm/files/start-scripts/10-munge b/roles/slurm_dockerimage/files/start-scripts/10-munge similarity index 100% rename from roles/slurm/files/start-scripts/10-munge rename to roles/slurm_dockerimage/files/start-scripts/10-munge diff --git a/roles/slurm_dockerimage/tasks/dockerimage.yml b/roles/slurm_dockerimage/tasks/dockerimage.yml new file mode 100644 index 0000000..c63d458 --- /dev/null +++ b/roles/slurm_dockerimage/tasks/dockerimage.yml @@ -0,0 +1,47 @@ +- copy: + src: "{{image.name}}.Dockerfile" + dest: "/container/docker-images/slurm/{{image.name}}.Dockerfile" + owner: "{{unpriv_user}}" + group: docker + register: slurm_cp_dockerfile + +# TODO: single source of truth: +# dockerfile -> parse for startup files or startup files template in dockerfile + +- name: copy startup scripts + copy: + contents: "{{ item.content | default(lookup('file', item.name)) }}" + dest: "/container/docker-images/slurm/start-scripts/{{item.name}}" + owner: root + group: root + mode: u=rwx,g=rx,o=rx + loop: "{{ start_scripts | default([]) }}" + register: slurm_cp_stscrs + +- set_fact: + slurm_stscrs_changed: "{{ (slurm_stscrs_changed | default([])) + + (slurm_cp_stscrs.results | selectattr('changed') | + map(attribute='item.name') | list) }}" +- set_fact: + slurm_stscrs_relevant: "{{ slurm_stscrs_changed | + intersect(start_scripts | default([]) | map(attribute='name') | list) | + length > 0 }}" + +- debug: msg="{{slurm_cp_dockerfile.changed or + slurm_stscrs_relevant or + slurm_baseimg_build_chg }}" + +- docker_image: + name: "slurm" + tag: "{{image.name}}" +# pull: False + build: + pull: False + path: "/container/docker-images/slurm/" + dockerfile: "{{image.name}}.Dockerfile" +# target: "{{image.name}}" # unsupported on old docker-py version as in el7 + source: build + force_source: "{{slurm_cp_dockerfile.changed or + slurm_stscrs_relevant or + slurm_baseimg_build_chg }}" + # TODO: force when base image changed! diff --git a/roles/slurm_dockerimage/tasks/main.yml b/roles/slurm_dockerimage/tasks/main.yml new file mode 100644 index 0000000..67d3f86 --- /dev/null +++ b/roles/slurm_dockerimage/tasks/main.yml @@ -0,0 +1,45 @@ +- file: + path: "/container/docker-images/slurm/start-scripts" + state: directory + owner: "{{unpriv_user}}" + group: docker + +# - name: copy Dockerfile, entrypoint, docker-init and munge startup +- name: copy slurm base image requisite files + copy: # FIXME: swap out + src: "{{item.file}}" + dest: "/container/docker-images/slurm/{{item.file}}" + owner: "{{unpriv_user}}" + group: docker + mode: "{{ item.perms | default('u=rwx,g=rx,o=rx') }}" + loop: + - file: slurm-base.Dockerfile + perms: u=rw,g=r,o=r + - file: entrypoint.sh + - file: docker-init + - file: start-scripts/10-munge + when: not (slurm_baseimg_build_chg | default(False)) + register: slurm_baseimg_copy + +- name: build base image + docker_image: + name: "slurm" + tag: "base" +# pull: False + build: + pull: False + path: "/container/docker-images/slurm/" + dockerfile: "slurm-base.Dockerfile" +# target: "{{image.name}}" # unsupported on old docker-py version as in el7 + source: build + force_source: "{{slurm_baseimg_copy.changed}}" + # when: run only once but keep changed state + when: not (slurm_baseimg_build_chg | default(False)) + register: slurm_baseimg_build + +- set_fact: + slurm_baseimg_build_chg: + "{{(slurm_baseimg_build_chg | default(False)) or + slurm_baseimg_build.changed}}" + +- include_tasks: dockerimage.yml