2017-07-13 2 views
1

私は自分自身で(cmdbを更新する)モジュールを作成しようとしていますが、モジュールコードでanacible_factsを使用する方法を探していますか?私のモジュールスクリプトのモジュールコードでanacible_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を呼び出すために使用する必要がありますどのような変数? (それは可能ですか?)

答えて

1

これは、あらかじめ定義されたパラメータを持つリモートマシンのコンテキストで実行されるため、これはモジュール内部から可能であるとは思えません。

しかし、アクションプラグイン(ローカルコンテキストで実行される)でモジュールをラップし、使用可能な変数から必要なデータを収集し、パラメータとしてモジュールに渡すことができます。この(./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の値に設定されます期待しています。

モジュールの一例(./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: 
+0

はあなたの例@Konstantinのためにどうもありがとうございます、しかし、あなたはどのようにして私を助けることができますこの例を正しく使用していますか? 'x = ActionModule() module.exit_json(changed = False、meta = module.params、msg = x)' とエラーが発生しました: 'x = ActionModule()\ nTypeError:__init __()ta"module_stdout": " " msg ":" MODULE FAILURE "、 " rc ":1 または、次のようなサンプルを表示してください。このクラス。私はこの質問を本当に申し訳なく思っていますが、私はPythonの初心者です。前もって感謝します。 –

+0

モジュールの例で私の答えを更新しました。 –

+0

ありがとうございます@コンスタンティンは働いています!あなたは私の日を救った –

関連する問題