# Concurrent running of ansible

**URL:** <https://forum.ansible.com/t/concurrent-running-of-ansible/18736>\
**Category:** Ansible Developer\
**Created:** [July 12, 2015, 2:08pm UTC](https://forum.ansible.com/t/concurrent-running-of-ansible/18736 "2015-07-12T14:08:17Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Valeriy\_Solovyov](https://avatars.discourse-cdn.com/v4/letter/v/8e8cbc/32.png) [@Valeriy\_Solovyov](https://forum.ansible.com/u/Valeriy_Solovyov)\
**Post date:** [July 12, 2015, 2:08pm UTC](https://forum.ansible.com/t/concurrent-running-of-ansible/18736/1 "2015-07-12T14:08:17Z")

</div>

Hello,

I want to run ansible/ansible-playbook concurrent. But I don’t know if there may be an error?

I have a python script. I tried it and there weren’t an errors, but maybe I did some wrong?

`

import json  
import threading  
import subprocess  
import time

lock = threading.Lock()  
storage =

def run\_cmd(cmd):  
“”“run command cmd and return (stdout, stderr)”“”  
handler = subprocess.Popen(  
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)  
stdout, stderr = handler.communicate()  
return stdout, stderr

def run\_and\_get\_json(cmd):  
sys\_data = None  
stdout = None  
try:

# pylint: disable=unused-variable

stdout, stderr = run\_cmd(cmd)

# pylint: disable=broad-except,invalid-name

except Exception as error:  
print “Can’t run %s because %s” % (cmd, error)  
try:  
sys\_data = json.loads(stdout)

# pylint: disable=broad-except

except Exception as error:  
print “Can’t parse output as json of %s because %s” % (cmd, error)  
return sys\_data

def run\_command(cmd):

sys\_data = run\_and\_get\_json(cmd)

with lock:  
global storage  
storage.append(sys\_data)

playbooks = [  
“/opt/manager/playbooks/rde/main.yml”,  
“/opt/manager/playbooks/test/main.yml”,  
“/home.local/manager/playbooks/Desktop\_Environment/main.yml”,  
“/home.local/manager/playbooks/Desktop\_Environment/main.yml”]

start\_time = time.time()  
threads =

for pb in playbooks:  
t= threading.Thread(target=run\_command, args=(“ansible-playbook -i 127.0.0.1, %s” % pb, )) #.start()  
threads.append(t)  
t.start()

# event.set()

for worker in threads:  
worker.join()  
print(“— %s seconds —” % (time.time() - start\_time))

storage =   
start\_time = time.time()  
for pb in playbooks:  
run\_command(“/home.local/valerys/rde\_2\_0/rdemanager/bin/get-tags -p %s” % pb )  
print(“— %s seconds —” % (time.time() - start\_time))

`

Regards.

---

<div class="post-metadata">

**Author:** ![Tim\_Chambers](https://avatars.discourse-cdn.com/v4/letter/t/a587f6/32.png) [@Tim\_Chambers](https://forum.ansible.com/u/Tim_Chambers)\
**Post date:** [July 14, 2015, 5:49pm UTC](https://forum.ansible.com/t/concurrent-running-of-ansible/18736/2 "2015-07-14T17:49:52Z")

</div>

Rather than calling the command line ansible-playbook, why not use the python API? Ansible has built-in concurrency. It’s forks, not threads, though. You can set how many forks run at once. Look at the ansible.runner documentation.
