class AnsibleEnvironment(): _cache = {} def __init__(self): ansible_basedir = os.path.join( os.environ.get("PROJECT_ENVIRONMENT_FILES_PATH"), "ansible") loader = CustomLoader() loader.set_basedir(ansible_basedir) var_manager = VariableManager() # load the inventory, set the basic playbook directory self._inventory = Inventory(loader=loader, variable_manager=var_manager) self._inventory.set_playbook_basedir(ansible_basedir) group = self._inventory.get_group("all") # make sure we load all magic variables on top of the global variables self._vars = combine_vars( self._inventory.get_group_vars(group, return_results=True), var_manager._get_magic_variables(loader, False, None, None, False, False)) self._vars['groups'] = self._inventory.get_group_dict() self._vars['env'] = os.environ hostvars = {} for host in self._inventory.get_hosts(): hostvars[host.name] = host.get_vars() self._vars['hostvars'] = hostvars # create the template renderer self._templar = Templar(loader=loader, variables=self._vars) # setup some easy variables that we use a lot self._vars['control_ip'] = self.get_var( "hostvars[groups['control'][0]]['ansible_host']") self._vars['edge_ip'] = self.get_var( "hostvars[groups['edge'][0]]['ansible_host']") self._vars['monitor_ip'] = self.get_var( "hostvars[groups['monitor'][0]]['ansible_host']") def get_var(self, name, cache=True): if name not in self._cache or not cache: try: self._cache[name] = self._templar.template("{{%s}}" % name) except AnsibleUndefinedVariable: self._cache[name] = None return self._cache.get(name) def set_var(self, name, value): self._vars[name] = value def template(self, *templates): return '\n'.join([self._templar.template(tpl) for tpl in templates])
def get_inventory(self, group=None): """Get inventory, using most of above objects """ #inventory = InventoryManager(self.loader, sources=self.inventory) inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=self.inventory) hosts = inventory.get_group_dict() if group is not None: hosts = hosts[group] return hosts
def read_inventory_file(filename): """ filename is a path to an ansible inventory file returns a mapping of group names ("webworker", "proxy", etc.) to lists of hosts (ip addresses) """ from ansible.inventory import Inventory from ansible.parsing.dataloader import DataLoader from ansible.vars import VariableManager inventory = Inventory(loader=DataLoader(), variable_manager=VariableManager(), host_list=filename) return inventory.get_group_dict()
class MyInventory(Inventory): """ this is my ansible inventory object. """ def __init__(self, resource, loader, variable_manager): """ resource的数据格式是一个列表字典,比如 { "group1": { "hosts": [{"hostname": "10.0.0.0", "port": "22", "username": "******", "password": "******"}, ...], "vars": {"var1": value1, "var2": value2, ...} } } 如果你只传入1个列表,这默认该列表内的所有主机属于default_group组,比如 [{"hostname": "10.0.0.0", "port": "22", "username": "******", "password": "******"}, ...] """ self.resource = resource self.inventory = Inventory(loader=loader, variable_manager=variable_manager, host_list=[]) self.dynamic_inventory() print("get_group_dict--->", self.inventory.get_group_dict()) def add_dynamic_group(self, hosts, groupname, groupvars=None): """ add hosts to a group """ my_group = Group(name=groupname) # if group variables exists, add them to group if groupvars: for key, value in groupvars.iteritems(): my_group.set_variable(key, value) # add hosts to group for host in hosts: # set connection variables hostname = host.get("hostname") hostip = host.get('ip', hostname) hostport = host.get("port") username = host.get("username") password = host.get("password") ssh_key = host.get("ssh_key") my_host = Host(name=hostname, port=hostport) my_host.set_variable('ansible_ssh_host', hostip) my_host.set_variable('ansible_ssh_port', hostport) my_host.set_variable('ansible_ssh_user', username) my_host.set_variable('ansible_ssh_pass', password) my_host.set_variable('ansible_ssh_private_key_file', ssh_key) # set other variables for key, value in host.items(): if key not in ["hostname", "port", "username", "password"]: my_host.set_variable(key, value) # add to group my_group.add_host(my_host) # print("my_group--->", my_group.hosts) self.inventory.add_group(my_group) def dynamic_inventory(self): """ add hosts to inventory. """ if isinstance(self.resource, list): self.add_dynamic_group(self.resource, 'default_group') elif isinstance(self.resource, dict): for groupname, hosts_and_vars in self.resource.iteritems(): self.add_dynamic_group(hosts_and_vars.get("hosts"), groupname, hosts_and_vars.get("vars"))