2014-11-25 37 views
6

INI yapılandırma dosyalarını güncelleştirmek istiyorum.Bir döngüde with_dict öğesini kullanarak bir Ansible görevi nasıl yazılır (with_items)

Bugün, (group_vars olarak) var file bu şekilde bilgilerimi saklamak:

- 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'] 

mi orada: my yanıtlayıcı 'görevde

# 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 

, ben bu bilgileri bu şekilde kullanmak her "bölüm" parametresiyle, yani DEFAULT, database, token ile dict dosyamda yineleme yolu. Aslında, with_items döngüsünde iç içe geçmiş bir with_dict yapmak için bir yol bulmaya çalışıyorum.

+0

um, Ansel'de değil, jinja'da yinelemeniz gerektiği anlaşılıyor. – tedder42

+0

Bu durumda ini dosya şablonunu kullanmayı tercih ediyorum (bkz. 'Şablon modülü'). Yapmayı planladığınız şey olsa bile, çok kafa karıştırıcı olurdu. 'ini modülü 'çoğunlukla şablon modülünün kısayoludur, bu nedenle bunu yalnızca çok basit görevler için kullanmalısınız – ProfHase85

+0

Yorumunuz için teşekkürler tedder42 ve ProfHase85. Aslında, daha önce şablon dosyası kullanıyordum, ancak config dosyasını yükleyici tarafından kurulduğundan ve ini_file kullanarak bazı değerleri değiştirebilmeyi tercih ediyorum. Şablon dosyalarını kullandığınızda, yapılandırma dosyasının yazılımın yeni bir sürümü nedeniyle değiştiğinde ve uzak ana bilgisayara yapılandırma dosyasının önceki sürümüne koymaya devam ettiğinizde bir sorununuz olabilir. –

cevap

4

.ini dosyaları için değişkenleri düzenlemenin bu yolunda çok ilginç buluyorum.

Kendim kullanmak istedim, bu yüzden bir .ini dosyasının tüm anahtarlarını inifile modülüyle tek geçişte oluşturmaya izin veren bir eklenti üzerinde çalıştım.

İyi çalışıyor ve OpenStack yapılandırma dosyalarımı yönetmek için kullanıyorum.

Gelişim konusunda uzman değilim, ancak bu eklentinin herkes için yararlı olabileceğini düşünüyorum, bu yüzden eğer birileri bunu sürdürmek ve bunu mümkün olduğu gibi entegre etmek istiyorsa, o da kabul edilir.

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

eklenti kod:

dosya değişkenler:

eklenti aşağıdaki with_inidata ini_dosyası modülün ile kullanım için (bölüm, anahtar değeri) bir listede hiyerarşi verisini dönüştürür

# (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 

Görev kodu:

- 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 

Kullanmak için, eklenti kodunu /etc/ansible.cfg dosyasında tanımlanan dizinde "dataini" adıyla kopyalayın.

Bu, Ubuntu dağıtımı için/usr/share/ansible_plugins/lookup_plugins olmalıdır ve görevlerimi örneğimde olduğu gibi yazın.

Bu eklentinin ini dosya yönetiminizi basitleştirmenize izin vermesini umuyorum.

+0

Teşekkür ederim Pierre-Yves, Tam olarak istediğim bu. Kodunuzu en kısa zamanda deneyeceğim. Seni haberdar ederim. –

+0

Tekrar teşekkürler Pierre-Yves. Kodunuzu denedim ve çok iyi çalışıyor. –