2014-11-25 25 views
6

Desidero aggiornare i file di configurazione INI.Come scrivere un'attività Ansible utilizzando with_dict in un ciclo (with_items)

Oggi, devo conservare le mie informazioni in un file var (in group_vars) in questo modo: c'è un

- name: configuration/modify keystone.conf ini file DEFAULT section 
    ini_file: 
    section: DEFAULT 
    dest: /etc/keystone/keystone.conf 
    option: "{{item.key}}" 
    value: "{{item.value}}" 
    with_dict: identity_servers_conf['DEFAULT'] 

Is:

# Identity configuration information 
identity_servers_conf: 
    DEFAULT: 
    admin_token: "{{identity_admin_token}}" 
    verbose: True 
    database: 
    connection: "mysql://{{ identity_db_user }:{{ identity_db_password }}@{{ db_lb_name }}/{{ identity_db }}"  
    token: 
    provider: keystone.token.providers.uuid.Provider 
    driver: keystone.token.persistence.backends.sql.Token 

Nel mio compito Ansible, io uso queste informazioni in questo modo modo per scorrere il mio file dict con ogni parametro "sezione", cioè DEFAULT, database, token. Infatti, cerco di trovare un modo per fare un with_dict nidificato in un ciclo with_items.

+0

um, sembra che sia necessario eseguire iterazioni in jinja, non in Ansible. – tedder42

+0

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

+0

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. –

risposta

4

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.

+0

Grazie, Pierre-Yves, è esattamente quello che voglio. Proverò il tuo codice al più presto. Ti terremo aggiornato. –

+0

Grazie ancora Pierre-Yves. Ho provato il tuo codice e funziona molto bene. –