在我们的环境中,hadoop集群中的kerberos用户是通过Freeipa创建的。但是如果我们希望freeipa在创建用户的时候,
能够帮我们做一些前置的动作。此时可能就比较麻烦。
下面通过一个例子,来说明freeipa如何在创建或删除用户时调用我们自己定义的脚本。
1. 修改/etc/ipa/default.conf,将用户自定义的脚本增加到配置项中
如下例,增加自定义脚本test.sh:
[root@ipa139 ipa]# cat default.conf
... ...
ipa_user_script=/etc/ipa/test.sh
2. 按照上面配置正确配置test.sh,并保证它拥有可执行权限。在我们例子中,其内容如下:
[root@ipa139 ipa]# cat test.sh
#!/bin/bash
echo "a:$1 u:$2" >> /tmp/ipa_custom_$$
3. 修改ipa的user.py脚本。
这个脚本与python的版本有关,我安装的python为2.6,因此它的位置就在:
[root@ipa139 plugins]# pwd
/usr/lib/python2.6/site-packages/ipalib/plugins
[root@ipa139 plugins]# ll user.py
-rw-r--r--. 1 root root 34124 Nov 27 23:35 user.py
[root@ipa139 plugins]#
在这个脚本中增加上调用test.sh的语句。
[root@ipa139 plugins]# cat user.py
... ...
from ipapython.ipautil import ipa_generate_password, run #增加run,后面需要这个函数来执行脚本
... ...
class user_add(LDAPCreate):
... ...
def post_callback(self, ldap, dn, entry_attrs, *keys, **options):
.. ... ..
####在post_callback中增加脚本执行的部分信息 -- Begin
if 'ipa_user_script' in self.api.env:
try:
self.log.info("TTTT -- running %s %s %s" % (self.api.env.ipa_user_script, "add", dn))
run([self.api.env.ipa_user_script, "add", "%s" % dn, user_add.init_passwd])
except:
self.log.error("error runing %s" % self.api.env.ipa_user_script)
pass
return dn
####在post_callback中增加脚本执行的部分信息 --- End
api.register(user_add)
class user_del(LDAPDelete):
__doc__ = _('Delete a user.')
msg_summary = _('Deleted user "%(value)s"')
def pre_callback(self, ldap, dn, *keys, **options):
assert isinstance(dn, DN)
check_protected_member(keys[-1])
return dn
#### user_del,增加了post_callback,然后再增加执行脚本的动作
def post_callback(self, ldap, dn, *keys, **options):
if 'ipa_user_script' in self.api.env:
try:
self.log.info("TTTT 22 -- running %s %s %s" % (self.api.env.ipa_user_script, "del", dn))
run([self.api.env.ipa_user_script, "del", "%s" % dn, user_add.init_passwd])
except:
self.log.error("error runing %s" % self.api.env.ipa_user_script)
pass
return dn
#### user_del,增加了post_callback,然后再增加执行脚本的动作 --- End
api.register(user_del)
... ....
4. 重启ipactl,执行命令如下:
[root@ipa139 ipa]# ipactl restart
5. 验证:
此时我们可以通过ipa ui或者ipa命令来增加删除用户,就可以看到会/tmp目录下面打印相应的信息
6. 总结
1) ipa的python脚本还是比较清楚的。虽然我不懂python,但是大体的代码结构非常清楚。整个user的处理过程,
一般都分为三个部分:pre_callback, callback与post_callback,我们的执行脚本命令只需要在post_callback中增加即可
能够帮我们做一些前置的动作。此时可能就比较麻烦。
下面通过一个例子,来说明freeipa如何在创建或删除用户时调用我们自己定义的脚本。
1. 修改/etc/ipa/default.conf,将用户自定义的脚本增加到配置项中
如下例,增加自定义脚本test.sh:
[root@ipa139 ipa]# cat default.conf
... ...
ipa_user_script=/etc/ipa/test.sh
2. 按照上面配置正确配置test.sh,并保证它拥有可执行权限。在我们例子中,其内容如下:
[root@ipa139 ipa]# cat test.sh
#!/bin/bash
echo "a:$1 u:$2" >> /tmp/ipa_custom_$$
3. 修改ipa的user.py脚本。
这个脚本与python的版本有关,我安装的python为2.6,因此它的位置就在:
[root@ipa139 plugins]# pwd
/usr/lib/python2.6/site-packages/ipalib/plugins
[root@ipa139 plugins]# ll user.py
-rw-r--r--. 1 root root 34124 Nov 27 23:35 user.py
[root@ipa139 plugins]#
在这个脚本中增加上调用test.sh的语句。
[root@ipa139 plugins]# cat user.py
... ...
from ipapython.ipautil import ipa_generate_password, run #增加run,后面需要这个函数来执行脚本
... ...
class user_add(LDAPCreate):
... ...
def post_callback(self, ldap, dn, entry_attrs, *keys, **options):
.. ... ..
####在post_callback中增加脚本执行的部分信息 -- Begin
if 'ipa_user_script' in self.api.env:
try:
self.log.info("TTTT -- running %s %s %s" % (self.api.env.ipa_user_script, "add", dn))
run([self.api.env.ipa_user_script, "add", "%s" % dn, user_add.init_passwd])
except:
self.log.error("error runing %s" % self.api.env.ipa_user_script)
pass
return dn
####在post_callback中增加脚本执行的部分信息 --- End
api.register(user_add)
class user_del(LDAPDelete):
__doc__ = _('Delete a user.')
msg_summary = _('Deleted user "%(value)s"')
def pre_callback(self, ldap, dn, *keys, **options):
assert isinstance(dn, DN)
check_protected_member(keys[-1])
return dn
#### user_del,增加了post_callback,然后再增加执行脚本的动作
def post_callback(self, ldap, dn, *keys, **options):
if 'ipa_user_script' in self.api.env:
try:
self.log.info("TTTT 22 -- running %s %s %s" % (self.api.env.ipa_user_script, "del", dn))
run([self.api.env.ipa_user_script, "del", "%s" % dn, user_add.init_passwd])
except:
self.log.error("error runing %s" % self.api.env.ipa_user_script)
pass
return dn
#### user_del,增加了post_callback,然后再增加执行脚本的动作 --- End
api.register(user_del)
... ....
4. 重启ipactl,执行命令如下:
[root@ipa139 ipa]# ipactl restart
5. 验证:
此时我们可以通过ipa ui或者ipa命令来增加删除用户,就可以看到会/tmp目录下面打印相应的信息
6. 总结
1) ipa的python脚本还是比较清楚的。虽然我不懂python,但是大体的代码结构非常清楚。整个user的处理过程,
一般都分为三个部分:pre_callback, callback与post_callback,我们的执行脚本命令只需要在post_callback中增加即可
2) 但是有一点,因为这个脚本是我们自己手动修改的,因此,如果freeipa 使用多Master的情况,可能就需要自己去拷贝。
参考:https://gist.github.com/jb68/22ef9a8450fe86ae1670b94009f4f4a2