前言
基本上,所有的应用程序都有配置文件,如ELK,MySQL,vsftpd,zabbix等这些应用程序都具有配置文件,配置文件主要将一些需要改变软件使用的一些参数定义在配置文件中,让程序只管运行,而运行的时候需要使用的参数根据不同的需求自行选择。在Python中使用此模块用于编写相应的配置文件。
示例一个MySQL的配置文件
[root@whzabbix ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#default-character-set=utf8
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
#datadir=/var/lib/mysql
user=mysql
datadir=/data/Mysql/Data
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld-error.log
pid-file=/var/run/mysqld/mysqld.pid
slow-query-log=1
slow-query-log-file=/var/log/mysql-slow.log
long_query_time=0.2
log-bin=/data/Mysql/Logs/bin.log
relay-log=/data/Mysql/Logs/relay.log
binlog_format=ROW
relay_log_recovery=1
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect ='SET NAMES utf8mb4'
innodb_buffer_pool_size=5G
join_buffer_size=128M
sort_buffer_size=2M
read_rnd_buffer_size=2M
log_timestamps = SYSTEM
lower_case_table_names = 1
innodb_file_per_table=1
innodb_log_file_size=20M
max_allowed_packet=32M
max_connections=4096
binlog_expire_logs_seconds=604800
default_authentication_plugin= mysql_native_password
[client]
port=3306
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock
[mysql]
default-character-set=utf8mb4
配置文件分析
此配置文件有3个章节(section)[mysqld],[client],[mysql]。而每个章节内还有多个键值对儿(key = value)这种,所以整个是一个字典的嵌套。最外一层字典3个key,分别为[mysqld],[client],[mysql],然后每个章节下面的各种配置项为该key的值,而下面的每一个配置项也是一个字典,一个key = value,所以这里是两层字典嵌套。
使用Python 生成此配置文件
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig["mysqld"] = {
"user" : "mysql",
"datadir" : "/data/Mysql/Data",
"socket" : "/var/lib/mysql/mysql.sock"
}
mysqlconfig["client"] = {
"port" : 3306,
"default-character-set" : "utf8mb4",
"socket" : "/var/lib/mysql/mysql.sock"
}
mysqlconfig["mysql"] = {}
mysqlconfig["mysql"]["default-character-set"] = "utf8mb4"
with open("my.cnf","w") as configfile:
mysqlconfig.write(configfile)
因为没有写绝对路径,所以会在程序执行的当前目录生成一个文件,“my.cnf”,文件内容如下:
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
"查"配置文件
使用python读配置文件
import configparser
mysqlconfig = configparser.ConfigParser()
print(mysqlconfig.sections())
mysqlconfig.read("my.cnf")
print(mysqlconfig.sections())
print(mysqlconfig.options("mysqld"))
print(mysqlconfig.items("mysqld"))
print(mysqlconfig.get("mysqld","user"))
print(mysqlconfig.getint("client","port"))
"""
[]
['mysqld', 'client', 'mysql']
['user', 'datadir', 'socket']
[('user', 'mysql'), ('datadir', '/data/Mysql/Data'), ('socket', '/var/lib/mysql/mysql.sock')]
mysql
3306
"""
使用python判断配置文件中是否有某一章节
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
print(mysqlconfig.has_section("mysql"))
"""
True
"""
使用python判断配置文件中的某一章节中是否有某个参数
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
print(mysqlconfig.has_option("mysqld","user"))
print(mysqlconfig.has_option("mysqld","password"))
"""
True
False
"""
默认的也会一同输出。
“增”配置文件
增章节
原配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
增加章节(section)
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
mysqlconfig.add_section("newsection")
mysqlconfig.write(open("my.cnf","w"))
增加后配置内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
[newsection]
“增”选项
增加前配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
[newsection]
增加配置文件内容
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
mysqlconfig.set("newsection", "protocol" , "mysql")
mysqlconfig.write(open("my.cnf","w"))
增加后配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
[newsection]
protocol = mysql
“删”配置文件
删选项
删选项之前配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
[newsection]
protocol = mysql
删选项的脚本
import configparser
mysqlconfig = configparser.ConfigParser()
#修改或者删除之前得读出来后才可以操作
mysqlconfig.read("my.cnf")
mysqlconfig.remove_option("newsection","protocol")
mysqlconfig.write(open("my.cnf","w"))
删选项之后配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
[newsection]
相应的选项已经被移除了
删章节
删章节之前的配置
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
[newsection]
删章节脚本
import configparser
mysqlconfig = configparser.ConfigParser()
#修改或者删除之前得读出来后才可以操作
mysqlconfig.read("my.cnf")
mysqlconfig.remove_section("newsection")
mysqlconfig.write(open("my.cnf","w"))
删章节之后的配置
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
“改”配置文件
改之前配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 3306
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
改配置文件脚本
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
mysqlconfig.set("client","port","5000")
mysqlconfig.write(open("my.cnf","w"))
改之后配置文件内容
[mysqld]
user = mysql
datadir = /data/Mysql/Data
socket = /var/lib/mysql/mysql.sock
[client]
port = 5000
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysql]
default-character-set = utf8mb4
写其实是将现有文件的内容写到其它文件后覆盖
所以,并不是修改,而是覆盖。
遍历
使用python遍历配置文件章节
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
for key in mysqlconfig:
print(key)
"""
DEFAULT
mysqld
client
mysql
"""
使用python遍历配置文件中的配置项
import configparser
mysqlconfig = configparser.ConfigParser()
mysqlconfig.read("my.cnf")
for key in mysqlconfig["mysqld"]:
print(key)
"""
user
datadir
socket
"""
备注:如果有DEFAULT章节,如果只遍历一个非DEFAULT章节,DEFAULT章节也会一同输出。