如何将变量设置为 ansible 清单? [英] How to set vars into ansible inventory?

查看:23
本文介绍了如何将变量设置为 ansible 清单?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在剧本中我使用变量 {{excluded_service}}.我想从 python 运行 ansible playbook 并提供这个变量.而且我不能使用外部库存脚本来提供这个变量.我正在使用创建库存:

In playbook I'm using variable {{excluded_service}}. I want to run ansible playbook from python and provide this variable. And I can't use external inventory script to provide this variable. I am using to create inventory:

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

但我不明白在哪里可以添加变量的值?

but I don't understand where I can add value of variable?

我的代码,适用于外部库存脚本:

My code, that works with external inventory script:

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)

推荐答案

host_vars 文件?例如.创建一个名为 /etc/ansible/host_vars/localhost 的 YAML 文件,其中包含您想要放置的变量.

Specify the vars in a host_vars file? E.g. create a YAML file named /etc/ansible/host_vars/localhost with the vars you wanna put there.

我还不知道如何在 Python 代码中指定它.

I don't know, yet, how to specify it in Python code itself.

--- 更新---

快速查看代码后,我认为当您通过 host_list 参数指定主机时,ansible 不支持指定主机变量.我能想到的黑客(如果你必须在 python 代码中这样做)是:

After a quick look the code, I don't think ansible supports specifying host variables when you specify hosts via host_list parameter. Hacks I can think of (if you must do this in python code) are:

  • [误]使用 extra_vars 参数.
  • 从您的 Python 代码编写一个清单文件(YAML 或仅打印所需 JSON 的可执行文件),并将其路径作为参数 inventory 传递.

HTH

这篇关于如何将变量设置为 ansible 清单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆