<p>我处理的问题和kecer建议的完全一样,最终得到了同样的解决方案。由于我需要使用它几十个脚本,我创建了自己的库。让我和你分享这个解决方案。</p>
<p><strong>credlib.py</strong>--用于处理凭据的通用库</p>
<pre><code>class credential:
def __init__(self, hostname, username, password):
self.hostname = hostname
self.username = username
self.password = password
</code></pre>
<p><strong>my credentials.py</strong>--存储所有凭据的本地文件</p>
<pre><code>from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")
</code></pre>
<p><strong>mysystemlib.py</strong>--这是一个访问我的系统的通用库(支持新的凭据系统和旧的)</p>
<pre><code>from credlib import credential
def system_login(*args): # this is new function definition
#def system_login(hostname, username, password): # this was previous function definition
if len(args) == 1 and isinstance(args[0], credential):
hostname = args[0].hostname
username = args[0].username
password = args[0].password
elif len(args) == 3:
hostname = args[0]
username = args[1]
password = args[2]
else:
raise ValueError('Invalid arguments')
do_login(hostname, username, password) # this is original system login call
</code></pre>
<p><strong>main.py</strong>--组合凭据和系统库的主脚本</p>
<pre><code>from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)
</code></pre>
<p>请注意,传统的hostname/username/password方式仍然有效,因此不会影响旧脚本:</p>
<pre><code>mysystemlib.system_login("srv02", "user", "pass")
</code></pre>
<p>这有很多好处:</p>
<ul>
<li>在所有python脚本中使用相同的凭证系统</li>
<li>带有密码的文件是分开的(文件可以有更严格的权限)</li>
<li>文件不会存储在git存储库中(通过<code>.gitignore</code>排除),这样我们的python脚本/lib就可以与其他人共享,而不必公开凭据(每个人都在本地文件中定义自己的凭据)</li>
<li>如果需要更改密码,我们只在一个地方进行</li>
</ul>