diff --git a/examples/all.yaml b/examples/all.yaml index 7d39dcce..57b9ec4a 100644 --- a/examples/all.yaml +++ b/examples/all.yaml @@ -245,3 +245,12 @@ fio_git_username: "" fio_git_token: "" fio_git_branch: "" fio_cleanup: true + +#cron-job vars +enable_cronjob: false # Set true to enable the cronjob +cronJob_schedule: "* * * * *" +cronJob_concurrencyPolicy: "Allow" +cronJob_startingDeadlineSeconds: +cronJob_suspend: +cronJob_successfulJobsHistoryLimit: +cronJob_failedJobsHistoryLimit: diff --git a/playbooks/main.yml b/playbooks/main.yml index 897d3ae3..13652096 100644 --- a/playbooks/main.yml +++ b/playbooks/main.yml @@ -86,3 +86,5 @@ - import_playbook: request-header-identity-provider.yml when: request_header_provider is defined and request_header_provider +- import_playbook: ocp-cronjob.yml + when: enable_cronjob is defined and enable_cronjob diff --git a/playbooks/ocp-cronjob.yml b/playbooks/ocp-cronjob.yml new file mode 100644 index 00000000..51509648 --- /dev/null +++ b/playbooks/ocp-cronjob.yml @@ -0,0 +1,5 @@ +--- +- name: Start cronjob + hosts: bastion + roles: + - ocp-cronjob diff --git a/playbooks/roles/ocp-cronjob/README.md b/playbooks/roles/ocp-cronjob/README.md new file mode 100644 index 00000000..955d833e --- /dev/null +++ b/playbooks/roles/ocp-cronjob/README.md @@ -0,0 +1,66 @@ +OCP Cronjob creation +======================================= + +The role *"roles/ocp-cronjob"* provides automated creation of cronjobs. User can add cronjob value in the role variables for creation **Role Variables** section. +This role will create the cronjob and we can monitor the jobs usig oc commands + + +Requirements +------------ + + - Running OCP 4.x cluster. + + +Role Variables +-------------- + +| Variable | Required | Default |Comments | +|--------------------------------|----------|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| enable_cronjob | no | false | Flag to be set to true to enable cronjob | +| cronJob_schedule | no | * * * * * | can be updated as needed | | +| cronJob_concurrencyPolicy | no | Allow | Value can be anything from ["Allow","forbid","replace"] | +| cronJob_startingDeadlineSeconds | no | 200 | Can be updated as needed | +| cronJob_suspend | no | false | can be true or false | +| cronJob_successfulJobsHistoryLimit | no | 3 | can be updated as needed | +| cronJob_failedJobsHistoryLimit | no | 2 | can be updated as needed | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +Dependencies +------------ + + - None + + +Example Playbook +---------------- + + - name: Start cronjob + hosts: bastion + roles: + - ocp-cronjob + + +Steps to run playbook +---------------------- + + - Copy the ocp4-playbooks-extras/examples/inventory to the home/working directory + - To execute the playbook run the below sample command + + +Sample Command +--------------- + +ansible-playbook -i inventory -e @examples/all.yaml ~/ocp4-playbooks-extras/playbooks/ocp-cronjob.yml + + +License +------- + +See LICENCE.txt + + +Author Information +------------------ + +Swapnil Bobade (swapnil.bobade@ibm.com) diff --git a/playbooks/roles/ocp-cronjob/defaults/main.yml b/playbooks/roles/ocp-cronjob/defaults/main.yml new file mode 100644 index 00000000..dad9bdbe --- /dev/null +++ b/playbooks/roles/ocp-cronjob/defaults/main.yml @@ -0,0 +1,15 @@ +--- +# defaults file for playbooks/roles/ocp-cronjob +# all these values can be updated as needed +container_name: "busybox" +container_image: "busybox" +cronjob_namespace: "openshift-cronjob" +delete_cronjob: false +job_name: "cronjob" +enable_cronjob: false +cronJob_schedule: "*/1 * * * *" +cronJob_concurrencyPolicy: "Allow" +cronJob_startingDeadlineSeconds: 200 +cronJob_suspend: false +cronJob_successfulJobsHistoryLimit: 4 +cronJob_failedJobsHistoryLimit: 2 diff --git a/playbooks/roles/ocp-cronjob/tasks/main.yml b/playbooks/roles/ocp-cronjob/tasks/main.yml new file mode 100644 index 00000000..0b0e5d8a --- /dev/null +++ b/playbooks/roles/ocp-cronjob/tasks/main.yml @@ -0,0 +1,70 @@ +--- +# Creating namespace for cronjob +- name: Create namespace for cronjob + k8s: + state: present + definition: + apiVersion: v1 + kind: Namespace + metadata: + name: "{{ cronjob_namespace }}" + +# create cronjobs +- name: Create Cronjobs + block: + - name: Create Cronjob + template: + src: "{{ role_path }}/templates/cron-job.yml.j2" + dest: "{{ role_path }}/files/cronjob.yml" + + - name: Apply the cronjob + shell: oc apply -f "{{ role_path }}/files/cronjob.yml" + + - name: Check if pods are created + shell: oc get pods -n {{ cronjob_namespace }} --no-headers | wc -l + register: pod_count + until: pod_count.stdout|int > 0 + retries: 3 + delay: 30 + + - name: Check pod status + shell: oc wait -l parent=cronjobpi --for=condition=Ready pods + register: pod_status + + - debug: + msg: "{{ pod_status.stdout_lines }}" + + - name: Check if jobs are getting created + shell: oc get jobs -n {{ cronjob_namespace }} --no-headers | wc -l + register: job_count + until: job_count.stdout|int > 0 + retries: 3 + delay: 30 + + - name: Check if jobs are running + shell: oc get jobs -n {{ cronjob_namespace }} + register: output_jobs + + - name: Check if pods are running + shell: oc get pods -n {{ cronjob_namespace }} | grep "Completed\|Running" + register: output_pods + + - name: Fail if pods are not getting created + fail: + msg: "Pods are not getting created !" + when: pod_count.stdout|int == 0 + + - name: Fail if jobs are not getting created + fail: + msg: "Jobs are not getting created !" + when: job_count.stdout|int == 0 + + - debug: + msg: "{{ output_jobs.stdout_lines }}" + + - debug: + msg: "{{ output_pods.stdout_lines }}" + + - name: Delete cronjob if requested + shell: oc delete -f "{{ role_path }}/files/cronjob.yml" + when: delete_cronjob diff --git a/playbooks/roles/ocp-cronjob/templates/cron-job.yml.j2 b/playbooks/roles/ocp-cronjob/templates/cron-job.yml.j2 new file mode 100644 index 00000000..42768dc8 --- /dev/null +++ b/playbooks/roles/ocp-cronjob/templates/cron-job.yml.j2 @@ -0,0 +1,29 @@ +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ job_name }} + namespace: "{{ cronjob_namespace }}" +spec: + schedule: "{{ cronJob_schedule }}" + concurrencyPolicy: "{{ cronJob_concurrencyPolicy }}" + startingDeadlineSeconds: {{ cronJob_startingDeadlineSeconds }} + suspend: {{ cronJob_suspend }} + successfulJobsHistoryLimit: {{ cronJob_successfulJobsHistoryLimit }} + failedJobsHistoryLimit: {{ cronJob_failedJobsHistoryLimit }} + jobTemplate: + spec: + template: + metadata: + labels: + parent: "cronjobpi" + spec: + containers: + - name: {{ container_name }} + image: {{ container_image }} +{% if cronJob_concurrencyPolicy or cronJob_startingDeadlineSeconds %} + command: ["sleep", "80"] +{% else %} + command: ["echo", "Hello Openshift !!"] +{% endif %} + restartPolicy: Never