2015-03-05 14 views
0

В playbook я использую переменную {{excluded_service}}. Я хочу запустить загрузочную книгу с python и предоставить эту переменную. И я не могу использовать внешний инвентарь для предоставления этой переменной. Я использую для создания запасов:Как установить vars в незарегистрированный инвентарь?

hosts = ["127.0.0.1"] 
inventory=ansible.inventory.Inventory(hosts) 

, но я не понимаю, где я могу добавить значение переменной?

Мой код, который работает с внешним скриптом инвентаризации:

import sys 
import os 
import stat 
import json 

import ansible.playbook 
import ansible.constants as C 
import ansible.utils.template 
from ansible import errors 
from ansible import callbacks 
from ansible import utils 
from ansible.color import ANSIBLE_COLOR, stringc 
from ansible.callbacks import display 

playbook="/opt/RDE/3p/ansible/loop/testloop.yml" 
inventory="/opt/RDE/3p/ansible/loop/lxc.py" 
connection="local" 
timeout=10 
subset=None 

options={'subset': None, 'ask_pass': False, 'sudo': False, 'private_key_file': None, 'syntax': None, 'skip_tags': None, 'diff': False, 'check': False, 'remote_user': 'root', 'listtasks': None, 'inventory': '/opt/RDE/3p/ansible/loop/lxc.py', 'forks': 5, 'listhosts': None, 'start_at': None, 'tags': 'all', 'step': None, 'sudo_user': None, 'ask_sudo_pass': False, 'extra_vars': [], 'connection': 'smart', 'timeout': 10, 'module_path': None} 
sshpass = None 
sudopass = None 
extra_vars = {} 



def colorize(lead, num, color): 
    """ Print 'lead' = 'num' in 'color' """ 
    if num != 0 and ANSIBLE_COLOR and color is not None: 
     return "%s%s%-15s" % (stringc(lead, color), stringc("=", color), stringc(str(num), color)) 
    else: 
     return "%s=%-4s" % (lead, str(num)) 

def hostcolor(host, stats, color=True): 
    if ANSIBLE_COLOR and color: 
     if stats['failures'] != 0 or stats['unreachable'] != 0: 
      return "%-37s" % stringc(host, 'red') 
     elif stats['changed'] != 0: 
      return "%-37s" % stringc(host, 'yellow') 
     else: 
      return "%-37s" % stringc(host, 'green') 
    return "%-26s" % host 


inventory = ansible.inventory.Inventory(options['inventory']) 


hosts = ["127.0.0.1"] 



#inventory=ansible.inventory.Inventory(hosts) 

inventory.subset(options['subset']) 
if len(inventory.list_hosts()) == 0: 
    raise errors.AnsibleError("provided hosts list is empty") 

inventory.set_playbook_basedir(os.path.dirname(playbook)) 
stats = callbacks.AggregateStats() 
playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY) 
if options['step']: 
    playbook_cb.step = options['step'] 
if options['start_at']: 
    playbook_cb.start_at = options['start_at'] 



runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY) 
pb = ansible.playbook.PlayBook(
      playbook=playbook, 
      module_path=None, 
      inventory=inventory, 
      forks=options['forks'], 
      remote_user=options['remote_user'], 
      remote_pass=sshpass, 
      callbacks=playbook_cb, 
      runner_callbacks=runner_cb, 
      stats=stats, 
      timeout=options['timeout'], 
      transport=options['connection'], 
      sudo=options['sudo'], 
      sudo_user=options['sudo_user'], 
      extra_vars=extra_vars, 

      private_key_file=options['private_key_file'], 


      check=options['check'], 
      diff=options['diff']   
     ) 

playnum = 0 

failed_hosts = [] 
unreachable_hosts = [] 
try: 
    print pb.run() 

    hosts = sorted(pb.stats.processed.keys()) 
    print hosts 
    display(callbacks.banner("PLAY RECAP")) 
    playbook_cb.on_stats(pb.stats) 

    for h in hosts: 
     t = pb.stats.summarize(h) 
     if t['failures'] > 0: 
      failed_hosts.append(h) 
     if t['unreachable'] > 0: 
      unreachable_hosts.append(h) 

    retries = failed_hosts + unreachable_hosts 

    if len(retries) > 0: 
     filename = pb.generate_retry_inventory(retries) 
     if filename: 
      display("   to retry, use: --limit @%s\n" % filename) 

    for h in hosts: 
     t = pb.stats.summarize(h) 

     display("%s : %s %s %s %s" % (
      hostcolor(h, t), 
      colorize('ok', t['ok'], 'green'), 
      colorize('changed', t['changed'], 'yellow'), 
      colorize('unreachable', t['unreachable'], 'red'), 
      colorize('failed', t['failures'], 'red')), 
      screen_only=True 
     ) 

     display("%s : %s %s %s %s" % (
      hostcolor(h, t, False), 
      colorize('ok', t['ok'], None), 
      colorize('changed', t['changed'], None), 
      colorize('unreachable', t['unreachable'], None), 
      colorize('failed', t['failures'], None)), 
      log_only=True 
     ) 

except Exception as e: 
     print ("!!!!!!!ERROR: %s" % e) 

ответ

2

указать ВАР в host_vars file? . создайте файл YAML с именем /etc/ansible/host_vars/localhost с варнами, которые вы хотите положить туда.

Я еще не знаю, как указать его в самом коде Python.

--- обновление ---

После того, как быстрый взгляд код, я не думаю, что анзибль поддерживает уточняющие переменные хоста при указании хостов с помощью host_list параметра. Взломы, о которых я могу думать (если вы должны это сделать в коде python):

  • [mis] использовать параметр extra_vars.
  • Запишите файл инвентаря (YAML или исполняемый файл, который просто печатает требуемый JSON) из вашего кода на Python и передайте его путь как параметр inventory.

НТН

+0

Я могу писать JSON и читать его в сценарии инвентаризации, но я пытаюсь найти способ без написания и страшась файла. –

+1

@ ValeriySolovyov extra_vars или файл host_vars - это единственные варианты, которые я думаю ... – Kashyap