| ''' |
| /*- |
| * ============LICENSE_START======================================================= |
| * ONAP : APPC |
| * ================================================================================ |
| * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| * ================================================================================ |
| * Copyright (C) 2017 Amdocs |
| * ============================================================================= |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * ECOMP is a trademark and service mark of AT&T Intellectual Property. |
| * ============LICENSE_END========================================================= |
| */ |
| ''' |
| |
| import pymysql, sys |
| from os import listdir |
| from os.path import isfile, join |
| |
| class mySql(): |
| |
| def __init__(self, myhost, myuser, mypasswd, mydb): |
| self.con = True |
| self.error = '' |
| self.db = None |
| try: |
| self.db = pymysql.connect(host=myhost, |
| user=myuser, |
| passwd=mypasswd, |
| db=mydb) |
| self.cur = self.db.cursor() |
| except Exception as e: |
| self.error = e[1] |
| self.con = False |
| |
| def Query (self, myquery, val = None): |
| results = None |
| try: |
| if val: |
| self.cur.execute(myquery, val) |
| else: |
| self.cur.execute(myquery) |
| self.db.commit() |
| results = self.cur.fetchall() |
| except Exception, e: |
| results = repr(e) |
| return results |
| |
| def Close (self): |
| if self.db: |
| self.db.close() |
| |
| def loadPlaybook (sqlintf, value, version, ext = '.yml'): |
| |
| errorCode = 0 |
| diag = '' |
| |
| # Test if primary key already defined |
| query = "SELECT name FROM playbook WHERE name='" + value +"'" |
| results = sqlintf.Query (query) |
| if len(results) > 0: |
| pass |
| else: |
| query = "INSERT INTO playbook (name) VALUES ('" + value + "')" |
| results = sqlintf.Query (query) |
| if len(results) > 0: |
| errorCode = 1 |
| diag = results |
| |
| # Load playbook |
| file = open(playbook_path + value + ext, 'r') |
| load_file = file.read() |
| |
| if not errorCode: |
| sql = "UPDATE playbook SET value=%s, version=%s, type=%s WHERE name=%s" |
| |
| results = sqlintf.Query(sql, (load_file, version, ext, value)) |
| |
| if len (results) > 0: |
| # Error loading playbook |
| errorCode = 1 |
| diag = results |
| |
| return errorCode, diag |
| |
| def loadCredentials (sqlintf, hostgroup, hostname, cred): |
| errorCode = 0 |
| diag = '' |
| |
| # Load credentials |
| |
| query = "SELECT hostname,hostgroup FROM inventory WHERE hostname='" + hostname +"'" |
| results = sqlintf.Query (query) |
| |
| if hostname in str (results): |
| |
| results_hostgroups = results[0][1] |
| |
| if hostgroup in results_hostgroups.split(','): |
| query = "UPDATE inventory SET hostname='" + hostname + "',credentials='" +\ |
| cred +\ |
| "' WHERE hostname='" + hostname + "'" |
| else: |
| |
| results_hostgroups = results_hostgroups + ',' + hostgroup |
| |
| query = "UPDATE inventory SET hostname='" + hostname + "',credentials='" +\ |
| cred + "',hostgroup='" + results_hostgroups + \ |
| "' WHERE hostname='" + hostname + "'" |
| |
| results = sqlintf.Query (query) |
| |
| else: |
| |
| query = "INSERT INTO inventory (hostgroup, hostname, credentials) VALUES ('" + \ |
| hostgroup + "','" + hostname + "','" + cred + "')" |
| results = sqlintf.Query (query) |
| |
| if len (results) > 0: |
| # Error loading playbook |
| errorCode = 1 |
| diag = results |
| |
| return errorCode, diag |
| |
| |
| def readPlaybook (sqlintf, value, version=None): |
| |
| errorCode = 0 |
| diag = '' |
| |
| print "***> in AnsibleSql.readPlaybook" |
| |
| if not version: |
| query = "SELECT MAX(version) FROM playbook WHERE name like'" + value + "%'" |
| print " Query:", query |
| results = sqlintf.Query (query) |
| version = results[0][0] |
| |
| print " Provided playbook name:", value |
| print " Used version:", version |
| |
| results = [] |
| if version: |
| query = "SELECT value,type FROM playbook WHERE name='" + value + "@" + version + "'" |
| results = sqlintf.Query (query) |
| |
| print "Query:", query |
| print "Results:", results |
| |
| if len(results) == 0: |
| errorCode = 1 |
| else: |
| if len(results[0]) == 0: |
| errorCode = 1 |
| diag = results[0] |
| else: |
| diag = results[0] |
| |
| return value, version, errorCode, diag |
| |
| def readCredentials (sqlintf, tag): |
| errorCode = [] |
| diag = [] |
| |
| print "***> in AnsibleSql.readCredential" |
| |
| # Load credentials |
| |
| for rec in tag: |
| |
| # Try hostgroup |
| query = "SELECT hostgroup, hostname, credentials FROM inventory WHERE hostgroup LIKE '%" + \ |
| rec +"%'" |
| query_results = sqlintf.Query (query) |
| |
| results = () |
| for q in query_results: |
| if rec in q[0].split(','): |
| l = list(q) |
| l[0] = rec |
| q = tuple(l) |
| results = (q,) + results |
| |
| if len(results) == 0: |
| # Try hostname |
| query = "SELECT hostgroup, hostname, credentials FROM inventory WHERE hostname='" + \ |
| rec +"'" |
| results = sqlintf.Query (query) |
| |
| print " Query:", query |
| print " Results:", len(results), results |
| |
| if len(results) == 0: |
| errorCode = 1 |
| hostgroup = rec |
| hostname = rec |
| credentials = 'ansible_connection=ssh ansible_ssh_user=na ansible_ssh_private_key_file=na\n' |
| diag.append([hostgroup, hostname, credentials]) |
| else: |
| errorCode = 0 |
| for i in range(len (results)): |
| for h in results[i][0].split(','): |
| hostgroup = h |
| hostname = results[i][1] |
| credentials = results[i][2] |
| diag.append([hostgroup, hostname, credentials]) |
| |
| return errorCode, diag |
| |
| |
| if __name__ == '__main__': |
| |
| ################################################################ |
| # Change below |
| ################################################################ |
| host="localhost" # your host, usually localhost |
| user="mysql_user_id" # your username |
| passwd="password_4_mysql_user_id" # your password |
| db="ansible" # name of the data base |
| |
| playbook_path = "/home/ubuntu/RestServerOpenSource/" |
| inventory = "/home/ubuntu/RestServerOpenSource/Ansible_inventory" |
| ################################################################ |
| |
| onlyfiles = [f for f in listdir(playbook_path) |
| if isfile(join(playbook_path, f))] |
| |
| sqlintf = mySql (host, user, passwd, db) |
| |
| # Load playbooks |
| |
| print "Loading playbooks" |
| for file in onlyfiles: |
| if "yml" in file: |
| |
| name = file.split (".yml")[0] |
| print " Loading:", name |
| version = name.split("@")[1] |
| errorCode, diag = loadPlaybook (sqlintf, name, version, '.yml') |
| if errorCode: |
| print " Results: Failed - ", diag |
| else: |
| print " Results: Success" |
| |
| print "\nLoading inventory" |
| |
| # Load inventory |
| |
| hostgroup = None |
| inv = {} |
| file = open(inventory, 'r') |
| |
| for line in file: |
| |
| if '[' in line and ']' in line: |
| hostgroup = line.strip().replace('[','').replace(']','') |
| inv[hostgroup] = {} |
| elif hostgroup and len(line.strip())>0: |
| host = line.strip().split(" ")[0] |
| credentials = line.replace(host,"") |
| inv[hostgroup][host] = credentials |
| |
| file.close() |
| |
| for hostgroup in inv: |
| print " Loading:", hostgroup |
| hostfqdn = '' |
| cred = '' |
| for hostname in inv[hostgroup]: |
| cred = inv[hostgroup][hostname] |
| errorCode, diag = loadCredentials (sqlintf, hostgroup, hostname, cred) |
| if errorCode: |
| print " Results: Failed - ", diag |
| else: |
| print " Results: Success" |
| |
| print "\nReading playbook" |
| |
| # Read playbook |
| |
| if not sqlintf.con: |
| print "Cannot connect to MySql:", sqlintf.error |
| sys.exit() |
| |
| name = "ansible_sleep" |
| print "Reading playbook:", name |
| value, version, errorCode, diag = readPlaybook (sqlintf, name) |
| if errorCode: |
| print "Results: Failed - ", diag |
| else: |
| print "Results: Success" |
| print value |
| print version |
| print diag |
| |
| print "\nReading inventory" |
| |
| # Read inventory |
| |
| tag = ["your_inventory_test_group_name"] |
| print "Reading inventory tag:", tag |
| errorCode, diag = readCredentials (sqlintf, tag) |
| if errorCode: |
| print "Results: Failed - ", diag |
| else: |
| print "Results: Success" |
| print diag |
| |
| sqlintf.Close() |
| |