yamaha-network / ansible-collection-rtx

GNU General Public License v3.0
39 stars 3 forks source link

diff_againstのintendedオプション設定時の動作について #5

Open sakai00kou opened 3 years ago

sakai00kou commented 3 years ago

問題内容

backupパラメータで取得したコンフィグをintended_configで指定し、diff_againstパラメータをintendedオプションで動作させた際、--diffオプション無しで実行した場合は実行結果がokとなるが、--diffオプションをつけて実行すると、changedと判定される。

また、diff_againstパラメータをintendedintended_configrunning_configパラメータに同じファイルを指定して実行した場合、変更点が無くてもchangedと判定される。

再現手順

  1. 下記「実行コード」のタスクを記載したPlaybook作成。(hosts、vars設定は公式ページ通り)
  2. ansible-playbook -i inventory rtx.ymlを実行

発生頻度

毎回

環境

実行コード

以下コードで実行しました。

実行結果抜粋(上述の実行コードで実行)

# ansible-playbook -i inventory rtx.yml --diff

PLAY [NVR500] *******************************************************************************

TASK [get configuration] ********************************************************************
--- before
+++ after
@@ -1 +1,309 @@
-/root/yamaha.cfg
\ No newline at end of file
+description 1 yamaha
+login password *
+administrator password *
(省略)
+onfs bind usb1
\ No newline at end of file

changed: [NVR500]

PLAY RECAP **********************************************************************************
NVR500                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

補足

running_configパラメータが比較元となるファイルの指定、intended_configパラメータが比較先となるファイルを指定するパラメータと考えていますが、動作確認では判断できなかったため、質問させていただきました。

shogo-fujita commented 3 years ago

intended_configオプションで外部ファイルを参照する場合、以下のようにlookupを使って指定してください。 intended_config: "{{ lookup('file', '/root/yamaha.cfg') }}"

sakai00kou commented 3 years ago

ご回答ありがとうございます。

intended_config: "{{ lookup('file', '/root/yamaha.cfg') }}"とすることでintended_configファイルとの比較を行うことができました。

しかしながら、intendec_configで指定したコンフィグファイルに2バイト文字が含まれていたことから文字コードエラーとなってしまいました。

2バイト文字を使用しないようにするか、intendec_configで使用するコンフィグファイルの文字コードをutf-8等に変換することで事象を回避しplaybookを実行することができましたがコンフィグファイルに2バイト文字が含まれていた場合でもintendec_configで指定できるようにして頂けると助かります。

恐れ入りますが宜しくお願い致します。

参考(intended_configに2バイト文字が含まれるコンフィグを指定した際の実行結果)

# ansible-playbook -i hosts rtx.yml --diff

PLAY [NVR500] *******************************************************************************

TASK [get configuration] ********************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: UnicodeEncodeError: 'utf-8' codec can't encode character '\udc83' in position 1235: surrogates not allowed
fatal: [NVR500]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": false, "module_stderr": "Traceback (most recent call last):\n  File \"/root/.ansible/tmp/ansible-local-2104klyp91sl/ansible-tmp-1618268100.8913224-2110-72603710933653/AnsiballZ_rtx_config.py\", line 102, in <module>\n    _ansiballz_main()\n  File \"/root/.ansible/tmp/ansible-local-2104klyp91sl/ansible-tmp-1618268100.8913224-2110-72603710933653/AnsiballZ_rtx_config.py\", line 94, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/root/.ansible/tmp/ansible-local-2104klyp91sl/ansible-tmp-1618268100.8913224-2110-72603710933653/AnsiballZ_rtx_config.py\", line 40, in invoke_module\n    runpy.run_module(mod_name='ansible_collections.yamaha_network.rtx.plugins.modules.rtx_config', init_globals=None, run_name='__main__', alter_sys=True)\n  File \"/usr/lib64/python3.6/runpy.py\", line 205, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/usr/lib64/python3.6/runpy.py\", line 96, in _run_module_code\n    mod_name, mod_spec, pkg_name, script_name)\n  File \"/usr/lib64/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_rtx_config_payload_qe9u4btc/ansible_rtx_config_payload.zip/ansible_collections/yamaha_network/rtx/plugins/modules/rtx_config.py\", line 470, in <module>\n  File \"/tmp/ansible_rtx_config_payload_qe9u4btc/ansible_rtx_config_payload.zip/ansible_collections/yamaha_network/rtx/plugins/modules/rtx_config.py\", line 366, in main\n  File \"/tmp/ansible_rtx_config_payload_qe9u4btc/ansible_rtx_config_payload.zip/ansible/module_utils/basic.py\", line 772, in __init__\n  File \"/tmp/ansible_rtx_config_payload_qe9u4btc/ansible_rtx_config_payload.zip/ansible/module_utils/basic.py\", line 2078, in _log_invocation\nUnicodeEncodeError: 'utf-8' codec can't encode character '\\udc83' in position 1235: surrogates not allowed\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

PLAY RECAP **********************************************************************************
NVR500                     : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0