我发现这种组织.ini文件变量的方式非常有趣。
我想使用它,因此我开发了一个插件,可以通过inifile模块一次性生成.ini文件的所有键。
它运行良好,我用它来管理我的OpenStack配置文件。
虽然我不是开发专家,但我认为这个插件对每个人都很有用。如果有人想接手维护并将其集成到Ansible中,那么欢迎参与。
该插件将层次数据转换为列表(部分、键、值),可直接与inifile模块中的with_inidata一起使用。
vars文件:
...
glanceapi_conf:
DEFAULT:
verbose: "{{ image_log_verbose }}"
rabbit_host: "{{ amqp_host }}"
rabbit_port: "{{ amqp_port }}"
rabbit_userid: "{{ amqp_userid }}"
rabbit_password: "{{ amqp_password }}"
rabbit_ha_queues: "{{ amqp_ha_queues }}"
database:
connection: "mysql://{{ image_db_user }}:{{ image_db_password }}@{{ db_host }}/{{ image_db }}"
keystone_authtoken:
auth_uri: "http://{{ identity_admin_host }}:{{ identity_api_port }}/v2.0"
identity_uri: "http://{{ identity_admin_host }}:{{ identity_admin_port }}"
admin_tenant_name: "{{ image_ks_tenant }}"
admin_user: "{{ image_ks_user }}"
admin_password: "{{ image_ks_password }}"
paste_deploy:
flavor: keystone
glance_store:
default_store: file
filesystem_store_datadir: /var/lib/glance/images/
...
插件代码:
import ansible.utils as utils
import ansible.errors as errors
class LookupModule(object):
def __init__(self, basedir=None, **kwargs):
self.basedir = basedir
def run(self, terms, inject=None, **kwargs):
terms = utils.listify_lookup_plugin_terms(terms, self.basedir, inject)
if not isinstance(terms, dict):
raise errors.AnsibleError("inidata lookup expects a dictionnary , got '%s'" %terms)
ret = []
for item0 in terms:
if not isinstance(terms[item0], dict):
raise errors.AnsibleError("inidata lookup expects a dictionary, got '%s'" %terms[item0])
for item1 in terms[item0]:
ret.append((item0, item1, terms[item0][item1]))
return ret
任务代码:
- name: configuration.modify_glance-api_conf_file / modify glance-api.conf ini file
ini_file:
section: "{{ item.0 }}"
dest: /etc/glance/glance-api.conf
option: "{{ item.1 }}"
value: "{{ item.2 }}"
backup: yes
with_inidata: glanceapi_conf
要使用它,只需将名为"dataini"的插件代码复制到在/etc/ansible.cfg中定义的目录中。
对于Ubuntu发行版,这应该是/usr/share/ansible_plugins/lookup_plugins,并按照我的示例编写您的任务。
我希望这个插件能够帮助您简化ini文件的管理。