Esempio n. 1
0
    def test_run_ansible_playbook_manual(self, mock_FirebaseApplication_get):
        extData = {
                   "name" : "man1",
                   "playbook" : "---\n- name: install_vim\n  hosts: all\n  gather_facts: yes\n  remote_user: root\n  \n  \n  tasks:\n\n    - name: install_vim\n      yum: name=vim\n\n    - name: install_ansible\n      yum: name=ansible\n\n    - name: install_elinks\n      yum: name=elinks",
                   "type" : "manual",
                   "user_id" : "simplelogin:11"
                  }

        inventory = {
                     "key1" :
                        {
                         "name": "host1",
                         "group": "group1",
                         "ansible_ssh_host": "host1",
                         "ansible_ssh_user": "******",
                         "ansible_ssh_pass": "******"
                        }
                    }
        playbook = "---\n- name: install_vim\n  hosts: all\n  gather_facts: yes\n  remote_user: root\n  \n  \n  tasks:\n\n    - name: install_vim\n      yum: name=vim\n\n    - name: install_ansible\n      yum: name=ansible\n\n    - name: install_elinks\n      yum: name=elinks"
        sshkey = ""
        list_of_return_values = [extData, inventory, playbook, sshkey]

        mock_FirebaseApplication_get.side_effect = list_of_return_values

        with patch.object(FirebaseApplication, 'patch', return_value=None) as mock_FirebaseApplication_patch:
            with patch.object(FirebaseApplication, 'post', return_value=None) as mock_FirebaseApplication_post:
                with patch.object(ansible.playbook.PlayBook, 'run', return_value=None) as mock_ansiblePlaybook:
                    mock_FirebaseAuthentication = FirebaseAuthentication("secret", True, True)
                    mock_FirebaseAuthentication.__main__ = MagicMock(return_value="myauth")
                    run_ansible_playbook_manual(11, 'proj123', 'job123')

        assert mock_FirebaseApplication_get.called
        assert mock_FirebaseApplication_patch.called
        assert mock_FirebaseApplication_post.called
        assert mock_ansiblePlaybook.called
Esempio n. 2
0
    def test_run_ansible_jeneric(self, mock_FirebaseApplication_get):
        extData = {
                   "host_list" : [ "test1", "cloudserver1", "host1" ],
                   "module_name" : "ping",
                   "pattern" : "all",
                   "module_args" : "",
                   "project_id" : "proj123",
                   "remote_pass" : "lkjlkj",
                   "remote_user" : "root"
                   }
        inventory = {
                     "key1" :
                        {
                         "name": "host1",
                         "group": "group1",
                         "ansible_ssh_host": "host1",
                         "ansible_ssh_user": "******"
                        }
                    }
        sshkey = ""
        list_of_return_values = [extData, inventory, sshkey]

        mock_FirebaseApplication_get.side_effect = list_of_return_values

        with patch.object(FirebaseApplication, 'patch', return_value=None) as mock_FirebaseApplication_patch:
            with patch.object(FirebaseApplication, 'post', return_value=None) as mock_FirebaseApplication_post:
                with patch.object(ansible.runner.Runner, 'run', return_value=inventory) as mock_ansibleRunner:
                    mock_FirebaseAuthentication = FirebaseAuthentication("secret", True, True)
                    mock_FirebaseAuthentication.__main__ = MagicMock(return_value="myauth")
                    run_ansible_jeneric(11, 'proj123', 'job123')

        assert mock_FirebaseApplication_get.called
        assert mock_FirebaseApplication_patch.called
        assert mock_FirebaseApplication_post.called
        assert mock_ansibleRunner.called
Esempio n. 3
0
    def test_run_ansible_playbook(self, mock_FirebaseApplication_get):
        extData = {
                   "host_list" : [ "test1", "cloudserver1", "host1" ],
                   "module_name" : "ping",
                   "pattern" : "all",
                   "module_args" : "",
                   "project_id" : "proj123",
                   "remote_pass" : "lkjlkj",
                   "remote_user" : "root"
                  }
        inventory = {
                     "key1" :
                        {
                         "name": "host1",
                         "group": "group1",
                         "ansible_ssh_host": "host1",
                         "ansible_ssh_user": "******",
                         "ansible_ssh_pass": "******"
                        }
                    }
        role = {
                "name": "role1",
                "playHosts": "all",
                "user_id": "simplelogin:11",
                "modules":
                    {
                    "module1":
                        {
                        "name": "install_vim",
                        "option": "yum",
                        "order": 1,
                        "user_id": "simplelogin:11",
                        "options": [{"comment": "this is a comment", "paramater": "name", "required": "yes", "value": "vim"}]
                        }
                    }
                }
        sshkey = ""
        list_of_return_values = [extData, inventory, role, sshkey]

        mock_FirebaseApplication_get.side_effect = list_of_return_values

        with patch.object(FirebaseApplication, 'patch', return_value=None) as mock_FirebaseApplication_patch:
            with patch.object(FirebaseApplication, 'post', return_value=None) as mock_FirebaseApplication_post:
                with patch.object(ansible.runner.Runner, 'run', return_value=inventory) as mock_ansibleRunner:
                    mock_FirebaseAuthentication = FirebaseAuthentication("secret", True, True)
                    mock_FirebaseAuthentication.__main__ = MagicMock(return_value="myauth")
                    run_ansible_playbook(11, 'proj123', 'job123')

        assert mock_FirebaseApplication_get.called
        assert mock_FirebaseApplication_patch.called
        assert mock_FirebaseApplication_post.called
        assert mock_ansibleRunner.called
Esempio n. 4
0
    def test_run_ansible_playbook_git(self, mock_FirebaseApplication_get):
        extData = {
                   "name" : "real_lamp",
                   "playbooks" : {
                     "playbook1_id" : {
                       "name" : "site.yml"
                     }
                   },
                   "url" : "https://github.com/rackeric/ansible_lamp_simple",
                   "user_id" : "simplelogin:11"
                  }
        inventory = {
                     "key1" :
                        {
                         "name": "host1",
                         "group": "group1",
                         "ansible_ssh_host": "host1",
                         "ansible_ssh_user": "******",
                         "ansible_ssh_pass": "******"
                        }
                    }
        name = 'real_lamp'
        url = 'https://github.com/rackeric/ansible_lamp_simple'
        sshkey = ""
        list_of_return_values = [extData, name, url, inventory, sshkey]
        project_id = 'proj123'

        mock_FirebaseApplication_get.side_effect = list_of_return_values

        with patch.object(FirebaseApplication, 'patch', return_value=None) as mock_FirebaseApplication_patch:
            with patch.object(FirebaseApplication, 'post', return_value=None) as mock_FirebaseApplication_post:
                with patch.object(Repo, 'clone_from', return_value=None) as mock_Repo_clone_from:
                    with patch.object(os, 'chdir', return_value=None) as mock_chdir:
                        with patch.object(ansible.playbook.PlayBook, 'run', return_value=None) as mock_ansiblePlaybook:
                            with patch.object(shutil, 'rmtree', return_value='nothing') as mock_shutil:
                                mock_FirebaseAuthentication = FirebaseAuthentication("secret", True, True)
                                mock_FirebaseAuthentication.__main__ = MagicMock(return_value="myauth")
                                run_ansible_playbook_git(11, project_id, name, 'site.yml')

        git_dir = '/tmp/' + project_id + name
        assert mock_FirebaseApplication_get.called
        mock_Repo_clone_from.assert_called_once_with(url, git_dir)
        mock_chdir.assert_called_once_with(git_dir)
        # WTF, WHY DOESN'T THIS RUN IN JENKINS!
        #assert mock_ansiblePlaybook.called
        mock_shutil.assert_called_once_with(git_dir)
        assert mock_FirebaseApplication_patch.called
        assert mock_FirebaseApplication_post.called
Esempio n. 5
0
def ansible_jeneric(job_id, user_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    user = '******' + user_id
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/external_data/'
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(job_id, json.loads('{"status":"RUNNING"}'))

    # finally, get the actual job
    job = myExternalData.get(URL, job_id)

    myHostList = job['host_list'] + ','
    myModuleName = job['module_name']
    myModuleArgs = job['module_args']
    myPattern = job['pattern']
    myRemoteUser = job['remote_user']
    myRemotePass = job['remote_pass']

    runString = ""

    for arg in myHostList, myModuleName, myModuleArgs, myPattern, myRemoteUser, myRemotePass:
        if (arg):
            runString = runString + arg

    results = ansible.runner.Runner(
        pattern=myPattern,
        forks=10,
        module_name=myModuleName,
        module_args=myModuleArgs,
        remote_user=myRemoteUser,
        remote_pass=myRemotePass,
        host_list=myHostList,
    ).run()
    # run the ansible stuffs
    #results = ansible.runner.Runner(
    #    pattern=myHost, forks=10,
    #    module_name='command', module_args=myCommand,
    #).run()

    # get it to a good format
    #data = json.loads(results)
    #data = json.dumps(results)

    # set status to COMPLETE
    myExternalData.patch(job_id, json.loads('{"status":"COMPLETE"}'))

    if type(results) == dict:
        results = utils.jsonify(results)

    # post results to firebase
    myExternalData.post(job_id + '/returns', results)
    #returns.patch(job_id + '/returns', json.dumps(results))
    return results
Esempio n. 6
0
def ansible_jeneric_testing(job_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    URL = 'https://deploynebula.firebaseio.com/external_data/'
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(job_id, json.loads('{"status":"RUNNING"}'))

    # finally, get the actual job
    job = myExternalData.get(URL, job_id)

    myHostList = job['host_list'] + ','
    myModuleName = job['module_name']
    if (job['module_args']):
        myModuleArgs = job['module_args']
    else:
        myModuleArgs = ''
    myPattern = job['pattern']
    myRemoteUser = job['remote_user']
    myRemotePass = job['remote_pass']

    #myKeyFile = job['private_key_file']

    #tmpFile = open("/tmp/" + job_id, "w")
    #tmpFile.write(myKeyFile)
    #tmpFile.close()

    results = ansible.runner.Runner(pattern=myPattern,
                                    forks=10,
                                    module_name=myModuleName,
                                    module_args=myModuleArgs,
                                    remote_user=myRemoteUser,
                                    remote_pass=myRemotePass,
                                    host_list=myHostList
                                    #private_key_file='/tmp/keykey'
                                    ).run()

    # get it to a good format
    #data = json.loads(results)
    #data = json.dumps(results)

    # set status to COMPLETE
    myExternalData.patch(job_id, json.loads('{"status":"COMPLETE"}'))

    #if type(results) == dict:
    #    results = utils.jsonify(results)

    # post results to firebase
    myExternalData.post(job_id + '/returns', json.loads(results),
                        {'print': 'pretty'}, {'X_FANCY_HEADER': 'VERY FANCY'})
    #returns.patch(job_id + '/returns', json.dumps(results))
    return results
Esempio n. 7
0
    def test_populate_playbooks(self):
        with patch.object(FirebaseApplication, 'get', return_value='playbook') as mock_FirebaseApplication_get:
            with patch.object(Repo, 'clone_from', return_value='something') as mock_Repo:
                with patch.object(os, 'chdir', return_value=None) as mock_chdir:
                    with patch.object(glob, 'glob', return_value='play.yml') as mock_glob:
                        with patch.object(shutil, 'rmtree', return_value='nothing') as mock_shutil:
                            with patch.object(FirebaseApplication, 'post', return_value='nothing') as mock_FirebaseApplication_post:
                                mock_FirebaseAuthentication = FirebaseAuthentication("secret", True, True)
                                mock_FirebaseAuthentication.__main__ = MagicMock(return_value="myauth")
                                populate_playbooks(11, 'proj123', 'playbook123')

        project_id = 'proj123'
        git_url = "play.yml"
        git_dir = '/tmp/' + project_id + 'playbook'
        assert mock_FirebaseApplication_get.called
        mock_Repo.assert_called_once_with("playbook", git_dir)
        mock_chdir.assert_called_once_with(git_dir)
        mock_glob.assert_called_once_with('*.y*ml')
        mock_shutil.assert_called_once_with(git_dir)
        assert mock_FirebaseApplication_post.called
Esempio n. 8
0
 def __init__(self, user_id):
     auth = FirebaseAuthentication(
         'kUFM5wAt2CkXtfKrglMjLPgNsuWsO33j1uKHMRyn', '*****@*****.**',
         True, True)
     self.db = firebase.FirebaseApplication(
         'https://pickme-f283e.firebaseio.com', auth)
     self.user_id = user_id
     self.posts = {}
     self.dummy_posts = {}
     self.votes = {}
     self.hearts = {}
     self.comments = {}
     self.bookmarks = {}
     self.user_cards = {}
     self.user_hearts = {}
     self.user_bookmarks = {}
     self.hot_post = []
     self.user_acted = []
Esempio n. 9
0
def ansible_ping(job_id, user_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    user = '******' + user_id
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/external_data/'
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(job_id, json.loads('{"status":"RUNNING"}'))

    # finally, get the actual job
    job = myExternalData.get(URL, job_id)

    # get host from job
    # NEEDS UPDATING FOR SPECIFICS
    myHost = job['host']

    # run the ansible stuffs
    results = ansible.runner.Runner(module_name='ping',
                                    module_args='',
                                    pattern=myHost,
                                    forks=10).run()

    # get it to a good format
    #data = json.loads(results)
    #data = json.dumps(results)

    # set status to COMPLETE
    other_result = myExternalData.patch(job_id,
                                        json.loads('{"status":"COMPLETE"}'))

    # post results to firebase
    #returns = FirebaseApplication('https://deploynebula.firebaseio.com/external_data/', authentication)
    myExternalData.post(job_id + '/returns', json.dumps(results))
    #returns.patch(job_id + '/returns', json.dumps(results))

    return results
Esempio n. 10
0
class Firebase_Backend(PiSmoker_Backend):
    firebase_inst = None
    """@type self.firebase_inst: firebase"""
    fb_params = {'print': 'silent'}
    _polling_interval = 3  # Frequency to poll web for new parameters
    _read_program_interval = 60  # Frequency to poll web for new program

    _last_write_parameters = time()
    _last_read_parameters = time()
    _last_write_program = time()
    _last_read_program = time()
    _last_write_control = time()
    _last_read_control = time()
    _do_async = True
    _init_args = None
    _init_kwargs = None

    def __init__(self, app_url, auth_secret, async=True, *args, **kwargs):
        auth = FirebaseAuthentication(secret=auth_secret,
                                      email='*****@*****.**')
        self.firebase_inst = FirebaseApplication(app_url, authentication=auth)
        self._do_async = async
Esempio n. 11
0
def ansible_jeneric(user_id, project_id, job_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    user = '******' + str(user_id)
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/external_data/'
    #myExternalData = FirebaseApplication(URL)
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(job_id, json.loads('{"status":"RUNNING"}'))

    # finally, get the actual job and set ansible options
    job = myExternalData.get(URL, job_id)

    # set vars from job data in firebase
    myHostList = job['host_list']
    myModuleName = job['module_name']
    if 'module_args' in job.keys():
        myModuleArgs = job['module_args']
    else:
        myModuleArgs = ''
    myPattern = job['pattern']
    myRemoteUser = job['remote_user']
    myRemotePass = job['remote_pass']
    myProjectID = job['project_id']

    # set and get Ansible Project Inventory
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + myProjectID
    job = myExternalData.get(URL, 'inventory')

    # creating Ansible Inventory based on host_list
    myInventory = ansible.inventory.Inventory(myHostList)

    # set Host objects in Inventory object based on hosts_lists
    # NEED: to set other host options
    # BUG: hostnames with periods (.) do not work
    for key, host in job.iteritems():
        if host['name'] in myHostList:
            tmpHost = myInventory.get_host(host['name'])
            tmpHost.set_variable("ansible_ssh_host", host['ansible_ssh_host'])
            tmpHost.set_variable("ansible_ssh_user", host['ansible_ssh_user'])
            if host.has_key('ansible_ssh_pass'):
                tmpHost.set_variable("ansible_ssh_pass",
                                     host['ansible_ssh_pass'])
            # Group Stuffs
            if myInventory.get_group(host['group']) is None:
                # set up new group
                tmpGroup = ansible.inventory.Group(host['group'])
                tmpGroup.add_host(myInventory.get_host(host['name']))
                myInventory.add_group(tmpGroup)
            else:
                # just add to existing group
                tmpGroup = myInventory.get_group(host['group'])
                tmpGroup.add_host(myInventory.get_host(host['name']))

    # get ssh key file
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id
    ssh_key = myExternalData.get(URL, '/ssh_key')

    tmpKey = open("/tmp/" + project_id + '_key', "w")
    tmpKey.write(ssh_key)
    # close file
    tmpKey.close()
    os.chmod("/tmp/" + project_id + '_key', 0600)

    # run ansible module
    if ssh_key is not None:
        results = ansible.runner.Runner(
            pattern=myPattern,
            forks=10,
            module_name=myModuleName,
            module_args=myModuleArgs,
            #remote_user=myRemoteUser,
            #remote_pass=myRemotePass,
            private_key_file='/tmp/' + project_id + '_key',
            inventory=myInventory,
        ).run()
    else:
        results = ansible.runner.Runner(
            pattern=myPattern,
            forks=10,
            module_name=myModuleName,
            module_args=myModuleArgs,
            #remote_user=myRemoteUser,
            #remote_pass=myRemotePass,
            inventory=myInventory).run()

    # set status to COMPLETE
    myExternalData.patch(job_id, {"status": "COMPLETE"})

    # jsonify the results
    #json_results = ansible.utils.jsonify(results)

    #
    # HELP! can't get a proper json object to pass, but below string works
    #
    myExternalData.post(job_id + '/returns/', sanitize_keys(results))

    os.remove('/tmp/' + project_id + '_key')

    return results
Esempio n. 12
0
def rax_create_server(user_id, project_id, job_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    user = '******' + str(user_id)
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/external_data/'
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(job_id, {"status": "BUILDING"})

    # finally, get the actual job and set ansible options
    job = myExternalData.get(URL, job_id)

    tmpUsername = job['rax_username']
    tmpAPIkey = job['rax_apikey']
    tmpFlavor = job['flavor']
    tmpImage = job['image']
    tmpServerName = job['servername']
    tmpGroup = job['group']
    tmpRegion = job['region']

    # set RAX cloud authentication
    pyrax.set_setting("identity_type", "rackspace")
    try:
        pyrax.set_credentials(job['rax_username'], job['rax_apikey'])
    except:
        pass
    try:
        pyrax.set_credentials(str(job['rax_username']), str(job['rax_apikey']))
    except:
        pass

    # set region
    cs = pyrax.connect_to_cloudservers(tmpRegion)

    # create objects
    #cs = pyrax.cloudservers

    # create cloud server
    server = cs.servers.create(tmpServerName, tmpImage, tmpFlavor)

    # add return object to firebase, but wait for networks
    myExternalData.patch(job_id, {'password': server.adminPass})

    # wait for networks then add to firebase
    #while not (server.networks):
    #    server = cs.servers.get(server.id)
    newServer = pyrax.utils.wait_for_build(server)

    # write results to firebase
    myExternalData.patch(job_id, {'networks': newServer.networks})

    # update firebase, add new server to inventory list
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/'
    myInventory = FirebaseApplication(URL, authentication)
    if ':' in newServer.networks['public'][0]:
        myNetwork = newServer.networks['public'][1]
    else:
        myNetwork = newServer.networks['public'][0]
    myInventory.post(
        'inventory', {
            'user_id': user,
            'name': tmpServerName,
            'group': tmpGroup,
            'ansible_ssh_host': myNetwork,
            'ansible_ssh_user': '******',
            'ansible_ssh_pass': server.adminPass
        })

    # update firebase with status COMPLETE
    myExternalData.patch(job_id, {"status": "COMPLETE"})

    return
Esempio n. 13
0
def ansible_playbook(user_id, project_id, playbook_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    user = '******' + str(user_id)
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/roles/'
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(playbook_id, {"status": "RUNNING"})

    # finally, get the actual job and set ansible options
    job = myExternalData.get(URL, playbook_id)

    ##
    ## Create full Ansible Inventory, playbook defines hosts to run on
    ##
    # set and get Ansible Project Inventory
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id
    inventory_list = myExternalData.get(URL, '/inventory')

    tmpHostList = []
    for key, host in inventory_list.iteritems():
        tmpHostList.append(host['name'])

    # creating Ansible Inventory based on host_list
    myInventory = ansible.inventory.Inventory(tmpHostList)

    # set Host objects in Inventory object based on hosts_lists
    # NEED: to set other host options
    # BUG: hostnames with periods (.) do not work
    for key, host in inventory_list.iteritems():
        tmpHost = myInventory.get_host(host['name'])
        tmpHost.set_variable("ansible_ssh_host", host['ansible_ssh_host'])
        tmpHost.set_variable("ansible_ssh_user", host['ansible_ssh_user'])
        if host.has_key('ansible_ssh_user'):
            tmpHost.set_variable("ansible_ssh_pass", host['ansible_ssh_pass'])
        # Group Stuffs
        if myInventory.get_group(host['group']) is None:
            # set up new group
            tmpGroup = ansible.inventory.Group(host['group'])
            tmpGroup.add_host(myInventory.get_host(host['name']))
            myInventory.add_group(tmpGroup)
        else:
            # just add to existing group
            tmpGroup = myInventory.get_group(host['group'])
            tmpGroup.add_host(myInventory.get_host(host['name']))

    ##
    ## Create temp playbook file
    ##
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/roles/'
    playbook = myExternalData.get(URL, playbook_id)

    # order tasks in playbook base on order field in dict
    def func(key):
        return playbook['modules'][key]['order']

    sorted_tasks_keys = sorted(playbook['modules'].keys(), key=func)

    tmpPlay = open("/tmp/" + playbook_id + '.yml', "w")

    tmpPlay.write("---\n")
    tmpPlay.write("- name: %s\n" % playbook['name'])
    tmpPlay.write("  hosts: %s\n" % playbook['playHosts'])
    tmpPlay.write("  remote_user: %s\n" % playbook['playUsername'])
    tmpPlay.write("\n")
    # if has variables
    if playbook.has_key('variables'):
        tmpPlay.write("  vars:\n")
        for key, var in playbook['variables'].iteritems():
            tmpPlay.write("    %s: %s\n" % (var['name'], var['value']))
        tmpPlay.write("\n")
    # if has tasks
    if playbook.has_key('modules'):
        tmpPlay.write("  tasks:\n")
        # if has includes
        if playbook.has_key('includes'):
            for key, include in playbook['includes']:
                tmpPlay.write("    - include: %s" % include['name'])
        # now for the tasks
        for key in sorted_tasks_keys:
            tmpPlay.write("    - name: %s\n" %
                          playbook['modules'][key]['name'])
            tmpPlay.write("      %s: " % playbook['modules'][key]['option'])
            for option in playbook['modules'][key]['options']:
                # for command and shell modules one-off crapness
                if option['paramater']:
                    tmpPlay.write("%s=%s " %
                                  (option['paramater'], option['value']))
                else:
                    tmpPlay.write("%s " % option['value'])
            tmpPlay.write("\n")
            # if has notify
            if option.has_key('notify'):
                tmpPlay.write("      notify:\n")
                tmpPlay.write("        - %s\n" % option['notify'])
            tmpPlay.write("\n")
    # if has handlers
    if playbook.has_key('handlers'):
        tmpPlay.write("  handlers:\n")
        for key, handler in playbook['handlers'].iteritems():
            tmpPlay.write("    - name: %s\n" % handler['name'])
            tmpPlay.write("      service: name=%s state=%s\n\n" %
                          (handler['service_name'], handler['service_state']))

    # close file
    tmpPlay.close()

    # get ssh key file
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id
    ssh_key = myExternalData.get(URL, '/ssh_key')

    tmpKey = open("/tmp/" + playbook_id + '_key', "w")
    tmpKey.write(ssh_key)
    # close file
    tmpKey.close()
    os.chmod("/tmp/" + playbook_id + '_key', 0600)

    prev = sys.stdout
    prev2 = sys.stderr
    try:
        sys.stdout = StringIO()
        sys.stderr = StringIO()

        # Run Ansible PLaybook
        stats = ansible.callbacks.AggregateStats()
        playbook_cb = ansible.callbacks.PlaybookCallbacks(
            verbose=utils.VERBOSITY)
        runner_cb = ansible.callbacks.PlaybookRunnerCallbacks(
            stats, verbose=utils.VERBOSITY)

        if ssh_key is not None:
            play = ansible.playbook.PlayBook(
                playbook='/tmp/' + playbook_id + '.yml',
                inventory=myInventory,
                runner_callbacks=runner_cb,
                stats=stats,
                callbacks=playbook_cb,
                private_key_file='/tmp/' + playbook_id + '_key',
                forks=10).run()
        else:
            play = ansible.playbook.PlayBook(playbook='/tmp/' + playbook_id +
                                             '.yml',
                                             inventory=myInventory,
                                             runner_callbacks=runner_cb,
                                             stats=stats,
                                             callbacks=playbook_cb,
                                             forks=10).run()

        myStdout = sys.stdout.getvalue()
        myStderr = sys.stderr.getvalue()
        #myExternalData.patch(playbook_id, {'stdout': myStdout})
        myExternalData.post(playbook_id + '/returns', {
            'stats': sanitize_keys(play),
            'stdout': myStdout
        })
        #myExternalData.patch(playbook_id, {'stderr': myStderr})
    finally:
        sys.stdout = prev
        sys.stderr = prev2

    ##
    ## Post play results in to firebase
    ##
    ## WHERE?
    # update status to RUNNING in firebase
    myExternalData.patch(playbook_id, {"status": "COMPLETE"})
    #myExternalData.post(playbook_id + '/returns', play)

    # delete tmp playbook file
    os.remove('/tmp/' + playbook_id + '.yml')
    # delete tmp key file
    os.remove('/tmp/' + playbook_id + '_key')

    return play
Esempio n. 14
0
def ansible_playbook_manual(user_id, project_id, playbook_id):

    # firebase authentication
    SECRET = os.environ['SECRET']
    authentication = FirebaseAuthentication(SECRET, True, True)

    # set the specific job from firebase with user
    user = '******' + str(user_id)
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/rolesmanual/'
    myExternalData = FirebaseApplication(URL, authentication)

    # update status to RUNNING in firebase
    myExternalData.patch(playbook_id, {"status": "RUNNING"})

    # finally, get the actual job and set ansible options
    job = myExternalData.get(URL, playbook_id)

    ##
    ## Create full Ansible Inventory, playbook defines hosts to run on
    ##
    # set and get Ansible Project Inventory
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id
    inventory_list = myExternalData.get(URL, '/inventory')

    tmpHostList = []
    if inventory_list:
        for key, host in inventory_list.iteritems():
            tmpHostList.append(host['name'])

        # creating Ansible Inventory based on host_list
        myInventory = ansible.inventory.Inventory(tmpHostList)

        # set Host objects in Inventory object based on hosts_lists
        # NEED: to set other host options
        # BUG: hostnames with periods (.) do not work
        for key, host in inventory_list.iteritems():
            tmpHost = myInventory.get_host(host['name'])
            tmpHost.set_variable("ansible_ssh_host", host['ansible_ssh_host'])
            tmpHost.set_variable("ansible_ssh_user", host['ansible_ssh_user'])
            if host.has_key('ansible_ssh_pass'):
                tmpHost.set_variable("ansible_ssh_pass",
                                     host['ansible_ssh_pass'])
            # Group Stuffs
            if myInventory.get_group(host['group']) is None:
                # set up new group
                tmpGroup = ansible.inventory.Group(host['group'])
                tmpGroup.add_host(myInventory.get_host(host['name']))
                myInventory.add_group(tmpGroup)
            else:
                # just add to existing group
                tmpGroup = myInventory.get_group(host['group'])
                tmpGroup.add_host(myInventory.get_host(host['name']))
    else:
        myInventory = ansible.inventory.Inventory()

    ##
    ## Create temp playbook file
    ##
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id + '/rolesmanual/' + playbook_id
    playbook = myExternalData.get(URL, '/playbook')

    tmpPlay = open("/tmp/" + playbook_id + '.yml', "w")

    tmpPlay.write(playbook)

    # close file
    tmpPlay.close()

    # get ssh key file
    URL = 'https://deploynebula.firebaseio.com/users/' + user + '/projects/' + project_id
    ssh_key = myExternalData.get(URL, '/ssh_key')

    tmpKey = open("/tmp/" + playbook_id + '_key', "w")
    tmpKey.write(ssh_key)
    # close file
    tmpKey.close()
    os.chmod("/tmp/" + playbook_id + '_key', 0600)

    prev = sys.stdout
    prev2 = sys.stderr
    try:
        sys.stdout = StringIO()
        sys.stderr = StringIO()

        # Run Ansible PLaybook
        stats = ansible.callbacks.AggregateStats()
        playbook_cb = ansible.callbacks.PlaybookCallbacks(
            verbose=utils.VERBOSITY)
        runner_cb = ansible.callbacks.PlaybookRunnerCallbacks(
            stats, verbose=utils.VERBOSITY)

        if ssh_key is not None:
            play = ansible.playbook.PlayBook(
                playbook='/tmp/' + playbook_id + '.yml',
                inventory=myInventory,
                runner_callbacks=runner_cb,
                stats=stats,
                callbacks=playbook_cb,
                private_key_file='/tmp/' + playbook_id + '_key',
                forks=10).run()
        else:
            play = ansible.playbook.PlayBook(playbook='/tmp/' + playbook_id +
                                             '.yml',
                                             inventory=myInventory,
                                             runner_callbacks=runner_cb,
                                             stats=stats,
                                             callbacks=playbook_cb,
                                             forks=10).run()

        #play = ansible.playbook.PlayBook(
        #    playbook='/tmp/' + playbook_id + '.yml',
        #    inventory=myInventory,
        #    runner_callbacks=runner_cb,
        #    stats=stats,
        #    callbacks=playbook_cb,
        #    forks=10
        #).run()

        myStdout = sys.stdout.getvalue()
        myStderr = sys.stderr.getvalue()
        #myExternalData.patch(playbook_id, {'stdout': myStdout})
        myExternalData.post(playbook_id + '/returns', {
            'stats': sanitize_keys(play),
            'stdout': myStdout
        })
        #myExternalData.patch(playbook_id, {'stderr': myStderr})
    finally:
        sys.stdout = prev
        sys.stderr = prev2

    ##
    ## Post play results in to firebase
    ##
    ## WHERE?
    # update status to RUNNING in firebase
    myExternalData.patch(playbook_id, {"status": "COMPLETE"})
    #myExternalData.post(playbook_id + '/returns', play)

    # delete tmp playbook file
    #os.remove("/tmp/" + playbook_id + '.yml')

    return play