Trovo molto interessante questo modo di organizzare le variabili per i file .ini.
Volevo usarlo da solo, quindi ho lavorato su un plugin che consente di generare tutte le chiavi di un file .ini in un passaggio con il modulo inifile.
Funziona bene e io uso per gestire i miei file di configurazione OpenStack.
Non sono uno specialista in sviluppo, ma penso che questo plugin possa essere utile a tutti, quindi se qualcuno vuole subentrare per mantenerlo e integrarlo in ansible, è il benvenuto.
Il plugin trasforma i dati gerarchici in un elenco (sezione chiave, valore) per l'uso direttamente con il modulo inifile with_inidata come di seguito:
vars di file:
...
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/
...
codice del plugin:
# (c) 2014, Pierre-Yves KERVIEL <[email protected]>
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
# inidata is used to manage ini
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
codice Task:
- 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
Per usarlo, copiare semplicemente il codice del plugin con il nome "dataini" nella directory definita in /etc/ansible.cfg.
Questo dovrebbe essere/usr/share/ansible_plugins/lookup_plugins per la distribuzione di Ubuntu e scrivere i compiti come nel mio esempio.
Spero che questo plugin ti permetta di semplificare la gestione dei tuoi file ini.
um, sembra che sia necessario eseguire iterazioni in jinja, non in Ansible. – tedder42
In questo caso preferirei usare un modello di file ini (si veda 'template module'). Anche se ciò che hai intenzione di fare era possibile, sembrerebbe molto confuso. Il 'ini module' è principalmente una scorciatoia per il modulo template, quindi dovresti usarlo solo per compiti molto semplici – ProfHase85
Grazie per il tuo commento tedder42 e ProfHase85. In realtà, stavo già utilizzando il file di modello, ma preferisco lasciare il file di configurazione come è stato installato dal programma di installazione e per modificare alcuni valori in esso utilizzando ini_file. Quando si utilizzano i file modello, è possibile che si verifichi un problema quando il file di configurazione cambia a causa di una nuova versione del software e si continua a inserire nell'host remoto la versione precedente del file di configurazione. –