- name: integration/async/runner_two_simultaneous_jobs.yml hosts: test-targets tasks: # Start 2 duplicate jobs, verify they run concurrently. - name: Cleanup semaphore file file: path: /tmp/flurp state: absent - name: create semaphore file and sleep for 5 seconds. shell: | exec 2>/dev/null; bash -c ' echo im_alive $$ > /tmp/flurp; sleep 60; '; rm -f /tmp/flurp; echo alldone async: 30 poll: 0 register: job1 # This guy prints the first field from the semaphore file and kills the PID # from the second field, cancelling the slow sleep above, so the busy-poll # below compltes quickly. - name: verify semaphore file exists while this job exists. shell: | while [ ! -f /tmp/flurp ]; do sleep 0.1; done; read im_alive pid < /tmp/flurp echo $im_alive kill $pid &>/dev/null async: 30 poll: 0 register: job2 - name: (job1) poll async_status: jid: "{{job1.ansible_job_id}}" register: result1 until: result1.finished retries: 5 delay: 1 - name: (job2) poll async_status: jid: "{{job2.ansible_job_id}}" register: result2 until: result2.finished retries: 5 delay: 1 - assert: that: - result1.rc == 0 - result2.rc == 0 fail_msg: | result1={{ result1 }} result2={{ result2 }} - assert: that: - result2.stdout == 'im_alive' fail_msg: | result2={{ result2 }} when: - ansible_version.full is version('2.8', '>=', strict=True) # ansible#51393 tags: - runner_two_simultaneous_jobs