1、用Python Shell设置或获取环境变量的方法:
设置系统环境变量
os.environ['环境变量名称']='环境变量值' #其中key和value均为string类型
os.putenv('环境变量名称', '环境变量值')
获取系统环境变量
os.environ['环境变量名称']
os.getenv('环境变量名称')
实例一、
In [52]: output=subprocess.check_output(["head -c 16 /dev/urandom | od -An -t x | tr -d ' '"], shell=True)
In [53]: print(output)
b'3512c668547cd983cb48ccf05b0ccedf\n'In [67]: output.strip()
Out[67]: b'3512c668547cd983cb48ccf05b0ccedf'In [72]: output.strip().strip('b')---------------------------------------------------------------------------TypeError Traceback (most recent call last) in
----> 1 output.strip().strip('b')
TypeError: a bytes-like object is required, not 'str'In [73]: os.environ["token"]=str(output.strip()).strip('b')
In [74]: os.getenv["token"]
Out[74]: "'3512c668547cd983cb48ccf05b0ccedf'"实例二、
os.environ["user"]="jenkins"os.getenv["user"]'jenkins'os.path.expanduser(path) 把path中包含的”~”和”~user”转换成用户目录
实例三、
os.path.expanduser("~")'/home/mysql'os.path.expandvars(path) 根据环境变量的值替换path中包含的”$name”和”${name}”
实例四、
os.environ["user"]="jenkins"os.path.expandvars("$user/mysql")'jenkins/mysql'
2、对文件内容中定义的变量替换成真实的值
特别注意:原文件必须是 python文件,否则不能替换,
如果想要修改文件中的某一行或者某一个位置的内容,在python中是没有办法直接实现的,只能先把文件所有的内容全部读取出来,然后进行匹配修改后写入到新的文件中。
例如想要把文件中的变量替换为真实的值需要进行如下操作:
查看原文件内容
注意:下面TOKEN不能写成$TOKEN , 写入后查看文件会变成空格
cat> /k8s/profile/token.py <
TOKEN,kubelet-bootstrap,10001,"system:kubelet-bootstrap"EOF
定义变量
In [7]: output=subprocess.check_output(["head -c 16 /dev/urandom | od -An -t x | tr -d ' '"], shell=True)
In [9]: token=str(output.decode('utf8').strip()).strip('b')
In [10]: print(token)
d3f4e95e05dfe34ea87217a55fb75bac
开始替换
In [3]: os.chdir('/etc/kubernetes/')
In [4]: if os.path.exists('token.csv'):
...: os.remove('token.csv')
In [56]: f = open('/k8s/profile/token.py','r',encoding='utf-8')
In [57]: f_new = open('/etc/kubernetes/token.csv','w',encoding='utf-8')
In [58]: for line inf:
...:if "TOKEN" inline:
...: line= line.replace('TOKEN',token)
...: f_new.write(line)
...: f.close()
...: f_new.close()3、替换文件中的主机名、ip 变量
cat> hostname_ip_py <
from __future__ importprint_functionimportos, sys, statimportshutilimporttarfileimportsubprocess#定义环境变量
#定义主机名
NODE_NAME = subprocess.check_output(["hostname"], shell=True)
NODE_NAME= str(NODE_NAME.decode('utf8').strip()).strip('b')#定义主机ip
NODE_IP = subprocess.check_output(["hostname -i | awk '{print $NF}'"], shell=True)
NODE_IP= str(NODE_IP.decode('utf8').strip()).strip('b')
ETCD_NODES= "test1=https://192.168.0.91:2380,test2=https://192.168.0.92:2380,test3=https://192.168.0.93:2380"
#创建 etcd.service文件
f = open('/k8s/profile/etcd.service.template.py', 'r', encoding='utf-8')
f_new= open('/etc/systemd/system/etcd.service', 'w', encoding='utf-8')for line inf:if "NODE_NAME" inline:
line= line.replace('NODE_NAME', NODE_NAME)elif "NODE_IP" inline:
line= line.replace('NODE_IP', NODE_IP)elif "ETCD_NODES" inline:
line= line.replace('ETCD_NODES', ETCD_NODES)
f_new.write(line)print("替换完成")
f.close()
f_new.close()
EOF