With OpenStack i need to sync users from corporate Microsoft Active Directory to OpenLDAP managed by Keystone.
As input i have list of user DNs. Script syncs only particular user parameters, such as
These parameters a minimum enough for Keystone.
Usage:
1) Make sure you have "python-ldap" installed
2) Prepare "users" file with list of DNs in source AD
As input i have list of user DNs. Script syncs only particular user parameters, such as
- objectclass
- cn
- givenName
- sn
- uid
- userPassword
- carLicense
These parameters a minimum enough for Keystone.
Usage:
1) Make sure you have "python-ldap" installed
2) Prepare "users" file with list of DNs in source AD
CN=user1,OU=USERS,DC=EXAMPLE,DC=comCN=user2,OU=OTHER,OU=USERS,DC=EXAMPLE,DC=com
3) Start script below./sync_users.py --users_file users \ --src_ldap_uri ldap://192.168.0.11:389 \
--src_ldap_user 'DOMAIN\administrator' \
--src_ldap_pass 'xxx' \
--dst_ldap_uri 'ldap://10.0.0.11' \
--dst_ldap_user 'cn=admin,dc=domain,dc=tld' \
--dst_ldap_pass xxx \
--dst_ldap_tree 'ou=Users,dc=domain,dc=tld'
#!/usr/bin/pythonimport ldapimport ldap.modlist as modlistimport argparseparser = argparse.ArgumentParser()parser.add_argument('--users_file', default='users')parser.add_argument('--src_ldap_uri', required=True)parser.add_argument('--src_ldap_user', required=True)parser.add_argument('--src_ldap_pass', required=True)parser.add_argument('--dst_ldap_uri', required=True)parser.add_argument('--dst_ldap_user', required=True)parser.add_argument('--dst_ldap_pass', required=True)parser.add_argument('--dst_ldap_tree', required=True)args = parser.parse_args()USERS_FILE = args.users_fileSRC_LDAP_URI = args.src_ldap_uriSRC_LDAP_USER = args.src_ldap_userSRC_LDAP_PASS = args.src_ldap_passDST_LDAP_URI = args.dst_ldap_uriDST_LDAP_USER = args.dst_ldap_userDST_LDAP_PASS = args.dst_ldap_passDST_LDAP_USER_TREE = args.dst_ldap_treedef prepare_attrs(src_attrs): attrs = {} attrs['objectclass'] = ['top','inetOrgPerson','organizationalPerson','person'] attrs['mail'] = src_attrs["mail"] attrs['cn'] = src_attrs["cn"] attrs['givenName'] = src_attrs["givenName"] attrs['sn'] = src_attrs["sAMAccountName"] attrs['uid'] = src_attrs["sAMAccountName"] attrs['userPassword'] = '{SASL}%s' % src_attrs["mail"] attrs['carLicense'] = 'TRUE' return attrssrc_ldap = ldap.initialize(SRC_LDAP_URI)src_ldap.simple_bind_s(SRC_LDAP_USER, SRC_LDAP_PASS)dst_ldap = ldap.initialize(DST_LDAP_URI)dst_ldap.simple_bind_s(DST_LDAP_USER, DST_LDAP_PASS)with open(USERS_FILE) as f: users_to_sync = f.read().splitlines()for user_dn in users_to_sync: user_cn = user_dn.split(',')[0] user_tree = user_dn.split(',', 1)[1] user = src_ldap.search_s(user_tree, ldap.SCOPE_ONELEVEL, user_cn) if user: dn = "cn=%s,%s" % (user_cn, DST_LDAP_USER_TREE) ldif = modlist.addModlist(prepare_attrs(user[0][1])) try: dst_ldap.add_s(dn,ldif) print "Synced user %s" % user[0][0] except ldap.ALREADY_EXISTS: print "User %s already exists" % user[0][0]src_ldap.unbind_s()dst_ldap.unbind_s()
Комментариев нет:
Отправить комментарий