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 ' In [67]: output.strip() Out[67]: b'3512c668547cd983cb48ccf05b0ccedf' In [72]: output.strip().strip('b') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-72-d12ac1d7dec8> in <module> ----> 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 << EOF 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 in f: ...: if "TOKEN" in line: ...: line = line.replace('TOKEN',token) ...: f_new.write(line) ...: f.close() ...: f_new.close() 3、替换文件中的主机名、ip 变量 cat > hostname_ip_py << EOF #!/usr/bin/python # -*- codinig: utf-8 -*- from __future__ import print_function import os, sys, stat import shutil import tarfile import subprocess # 定义环境变量 # 定义主机名 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 in f: if "NODE_NAME" in line: line = line.replace('NODE_NAME', NODE_NAME) elif "NODE_IP" in line: line = line.replace('NODE_IP', NODE_IP) elif "ETCD_NODES" in line: line = line.replace('ETCD_NODES', ETCD_NODES) f_new.write(line) print("替换完成") f.close() f_new.close() EOF