我正在尝试创建自己的ansible模块(它将更新cmdb),并且正在寻找如何在模块代码中使用ansible_facts?
我的模块脚本的示例是:
#!/usr/bin/python from ansible.module_utils.basic import * import json, ast from servicenow import ServiceNow from servicenow import Connection def __get_server_info(table,server_name="", sys_id=""): if sys_id == "": return table.fetch_one({'name': server_name}) if server_name == "": return table.fetch_one({'sys_id': sys_id}) def __update_cmdb_hwinfo(table, sys_id, server_name=""): return table.update({'sys_id': sys_id,{'hw_ram': 'Here for example i want to put ansible_facts about server ram size'}) def main(): fields = { "snow_instance": {"required": True, "type": "str"}, "snow_username": {"required": True, "type": "str"}, "snow_password": {"required": True, "type": "str"}, "server_name": {"required": True, "type": "str" }, "api_type": {"default": "JSONv2", "type": "str"}, } module = AnsibleModule(argument_spec=fields) snow_connection = Connection.Auth(username=module.params['snow_username'], password=module.params['snow_password'], instance=module.params['snow_instance'], api=module.params['api_typ e']) server = ServiceNow.Base(snow_connection) server.__table__ = 'cmdb_ci_server_list.do' machine = __get_server_info(server, ) ## Define connection object to ServiceNow instance module.exit_json(changed=False, meta=module.params, msg=machine) if __name__ == '__main__': main()
我应该使用什么变量在模块脚本中调用ansible_facts?(还有可能吗?)。
我怀疑这是否可以从模块本身内部实现,因为它们是在具有预定义参数的远程计算机的上下文中执行的。
但是,您可以使用动作插件(在本地上下文中执行)包装模块,从可用变量中收集所需的数据,并将其作为参数传递给模块。
像这样(./action_plugins/a_test.py):
from ansible.plugins.action import ActionBase class ActionModule(ActionBase): def run(self, tmp=None, task_vars=None): result = super(ActionModule, self).run(tmp, task_vars) module_args = self._task.args.copy() module_args['mem_size'] = self._templar._available_variables.get('ansible_memtotal_mb') return self._execute_module(module_args=module_args, task_vars=task_vars, tmp=tmp)
在这种情况下,如果您的模块期望mem_size参数将通过ansible_memtotal_mb操作插件将其设置为的值。
mem_size
ansible_memtotal_mb
模块示例(./library/a_test.py):
#!/usr/bin/python def main(): module = AnsibleModule( argument_spec = dict( mem_size=dict(required=False, default=None), ), supports_check_mode = False ) module.exit_json(changed=False, mem_size=module.params['mem_size']) from ansible.module_utils.basic import * from ansible.module_utils.urls import * main()
测试手册:
--- - hosts: all tasks: - a_test: