Ansible系列-基础篇-配置文件Ini之Python版

欢迎关注个人公众号 DailyJobOps

源站地址 配置文件ini之python版

什么是ini配置文件

解释来自百度百科

ini 是 initialization的缩写,即初始化文件。最初出现在windows WIN3X,其主要是由 section和parameters组成,parameters是ini的基本组成单元,是由等号= 链接的键值对key=value,最常见比如PHP的配置文件格式就是ini格式

ini格式介绍

1、parameters

组成的基本单元,是由等号= 链接的键值对key=value,比如实际配置中

; 独立的parameter配置
demo_param = demo_value

[global]
mysql_host = 192.168.1.10
mysql_user = demouser

2、section

实际业务场景中,我们都会把某些parameters归属到一个分组,比如网站名称、网站关键字等归属到 global 分组,MySQL 主机、用户、端口等配置归属到 数据库分组;

这里的 global 分组 或者 数据库分组 在ini配置文件中对应的就是 section 概念

比如配置文件 demo.ini

; comments here
; demo_key = demo_value

[global]
site_name = colinspace website
site_url = http://blog.colinspace.com
site_keywords = ['colinspace', 'devops']

[database]
mysql_host = 192.168.1.10
mysql_user = demouser
mysql_password = demoPasswd
mysql_port = 3306

3、无section parameters会报错

如果某个parameter没有section,那么利用Python 的 configparser 模块解析的时候会直接报错,比如上面配置文件的中 demo_key = demo_value 就是没有属于的section,所以报错信息如下:

Traceback (most recent call last):
  File "demo_ini.py", line 25, in <module>
    cf.read_file(f)
  File "/Users/demouser/.pyenv/versions/3.6.6/lib/python3.6/configparser.py", line 718, in read_file
    self._read(f, source)
  File "/Users/demouser/.pyenv/versions/3.6.6/lib/python3.6/configparser.py", line 1080, in _read
    raise MissingSectionHeaderError(fpname, lineno, line)
configparser.MissingSectionHeaderError: File contains no section headers.
file: 'demo.ini', line: 2
'demo_key = demo_value\n'

4、注释信息

ini的注释使用 ; 分号,在想被注释的部分前面添加 分号; 即可,比如上面配置的中的

; comments here
; demo_key = demo_value

python 操作 ini 文件

ini 格式的文件后缀是没有要求的,可以是ini 或者其他,比如 cfg 、conf 等

一般对于ini的操作大概有以下:

  • 获取所有 section - cf.sections()
  • 检测某个section是否存在 - cf.has_section('section-name')
  • section 存在的时候获取该section下所有配置项items - cf.items('section-name')
  • section 存在的时候获取该section下都有哪些选项option - cf.options('section-name')
  • section 存在的时候,检测该section下是否存在某个option - cf.has_option('section-name', 'option-name')
  • section 存在的时候获取section下某个选项option的值 - cf.get('section-name', 'option-name')
  • 写入某些配置到 ini 文件 - cf.write(f)

这里先看demo脚本执行的结果,注意脚本的最后一行提示我们在 ini文件中写入了某些配置

(kfzdingoa) ➜  temp python demo_ini.py demo.ini
sections:  ['global', 'database']
has section?:  True
global section items:  [('site_name', 'colinspace website'), ('site_url', 'http://blog.colinspace.com'), ('site_keywords', "['colinspace', 'devops']")]
global section options:  ['site_name', 'site_url', 'site_keywords']
database section has mysql_user option?  True
get mysql_user value from database section:  demouser
==>Try to write some configurations into ini file<==

脚本

#!/usr/bin/env python
# encoding: utf-8
# Author: colinspace.com
# Desc: demo for python on ini file
#

import sys

# python3 中 configparser为小写和python2 不一样,所以做个判断导入
if sys.version_info.major == 2:
    import ConfigParser as cfg
else:
    import configparser as cfg

# 命令行输入需要解析的 ini 文件
if len(sys.argv) >= 2:
    ini_file = sys.argv[1]
elif len(sys.argv) < 2:
    print("Usage:")
    print("\tscript.py ini_file")
    sys.exit(5)

# 获取 ConfigParser 
cf = cfg.ConfigParser()

# 读取 ini 相关配置
with open(ini_file, 'a') as f:
    cf.read_file(f)
    print("sections: ", cf.sections())
    print("has section?: ", cf.has_section("global"))
    print("global section items: ", cf.items("global"))
    print("global section options: ", cf.options("global"))
    print("database section has mysql_user option? ", cf.has_option("database", "mysql_user"))
    print("get mysql_user value from database section: ", cf.get("database", "mysql_user"))

# 进行配置写入 ini 文件 
print("==>Try to write some configurations into ini file<==")
cf["cache"] = {"redis_host": "192.168.1.11", "redis_port": 6379}
with open(ini_file, 'w') as f:
    cf.write(f)

最后我们检查demo.ini 文件,发现cache相关的配置成功写入文件

(kfzdingoa) ➜  temp tail -4 demo.ini
[cache]
redis_host = 192.168.1.11
redis_port = 6379

另外也可以动态的添加 添加、删除配置


与君共勉
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容