Ansible と Jenkins: 「winrm がインストールされていません: 名前 utils をインポートできません

Ansible と Jenkins: 「winrm がインストールされていません: 名前 utils をインポートできません

数日前から Ansible と Jenkins を学び始めました。ある特定の問題に行き詰まっており、何度も試しても解決できません。コマンドラインから直接実行すると問題なく動作する非常に基本的なプレイブックがあります。

Ansible と Jenkins は同じ Ubutu 仮想マシンにインストールされます。

Jenkins 経由で実行したいのですが、実行はできますが、ワークフローがエラーで終了します。コンソール出力は次のとおりです。

Started by user Jenkins Operador
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/Ansible-demo
[Ansible-demo] $ /usr/bin/ansible-playbook /home/operador/Ansible/playbooks/ping.yaml -f 5

PLAY [My first play] ***********************************************************

TASK [Gathering Facts] *********************************************************
fatal: [ubuntu-srv]: FAILED! => {"msg": "winrm or requests is not installed: cannot import name utils"}

PLAY RECAP *********************************************************************
ubuntu-srv         : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

FATAL: command execution failed
hudson.AbortException: Ansible playbook execution failed
    at org.jenkinsci.plugins.ansible.AnsiblePlaybookBuilder.perform(AnsiblePlaybookBuilder.java:262)
    at org.jenkinsci.plugins.ansible.AnsiblePlaybookBuilder.perform(AnsiblePlaybookBuilder.java:232)
    at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123)
    at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:80)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:816)
    at hudson.model.Build$BuildExecution.build(Build.java:199)
    at hudson.model.Build$BuildExecution.doRun(Build.java:164)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:524)
    at hudson.model.Run.execute(Run.java:1899)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44)
    at hudson.model.ResourceController.execute(ResourceController.java:107)
    at hudson.model.Executor.run(Executor.java:449)
ERROR: Ansible playbook execution failed
Finished: FAILURE

プレイブックが Ansible では完璧に実行されるのに、Jenkins によって呼び出されると失敗する理由がわかりません。

@john-mahowald のコマンドに従って、次のコマンドを実行します。

ansible -m python_requirements_info -a dependencies=winrm localhost

戻り値:

localhost | SUCCESS => {
    "changed": false,
    "mismatched": {},
    "not_found": [
        "winrm"
    ],
    "python": "/usr/bin/python2",
    "python_system_path": [
        "/tmp/ansible_python_requirements_info_payload_PcEN_E/ansible_python_requirements_info_payload.zip",
        "/usr/lib/python2.7",
        "/usr/lib/python2.7/plat-x86_64-linux-gnu",
        "/usr/lib/python2.7/lib-tk",
        "/usr/lib/python2.7/lib-old",
        "/usr/lib/python2.7/lib-dynload",
        "/usr/local/lib/python2.7/dist-packages",
        "/usr/lib/python2.7/dist-packages"
    ],
    "python_version": "2.7.18 (default, Jul  1 2022, 12:27:04) \n[GCC 9.4.0]",
    "valid": {}
}

これが役立つかどうかはわかりませんが、pywinrm は Python3 用にのみインストールされているようです。

jenkins@ubuntu:/home/operador/Ansible/playbooks$ pip install pywinrm
Requirement already satisfied: pywinrm in /usr/local/lib/python3.8/dist-packages (0.4.3)
Requirement already satisfied: six in /usr/local/lib/python3.8/dist-packages (from pywinrm) (1.16.0)
Requirement already satisfied: requests-ntlm>=1.1.0 in /usr/local/lib/python3.8/dist-packages (from pywinrm) (1.1.0)
Requirement already satisfied: xmltodict in /usr/local/lib/python3.8/dist-packages (from pywinrm) (0.13.0)
Requirement already satisfied: requests>=2.9.1 in /usr/local/lib/python3.8/dist-packages (from pywinrm) (2.28.1)
Requirement already satisfied: ntlm-auth>=1.0.2 in /usr/local/lib/python3.8/dist-packages (from requests-ntlm>=1.1.0->pywinrm) (1.5.0)
Requirement already satisfied: cryptography>=1.3 in /usr/local/lib/python3.8/dist-packages (from requests-ntlm>=1.1.0->pywinrm) (38.0.3)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.8/dist-packages (from requests>=2.9.1->pywinrm) (3.4)
Requirement already satisfied: charset-normalizer<3,>=2 in /usr/local/lib/python3.8/dist-packages (from requests>=2.9.1->pywinrm) (2.1.1)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/dist-packages (from requests>=2.9.1->pywinrm) (2022.9.24)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.8/dist-packages (from requests>=2.9.1->pywinrm) (1.26.12)
Requirement already satisfied: cffi>=1.12 in /usr/local/lib/python3.8/dist-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->pywinrm) (1.15.1)
Requirement already satisfied: pycparser in /usr/local/lib/python3.8/dist-packages (from cffi>=1.12->cryptography>=1.3->requests-ntlm>=1.1.0->pywinrm) (2.21)

答え1

エラーが示唆するように、Ansible がコントローラーで使用する Python に、Python モジュール winrm または request をインストールします。

さらにトラブルシューティングを行うために、このコマンドは winrm モジュールの検索を試み、Python パスも出力します。技術的には、プラグイン python とは異なる可能性のあるモジュール python を使用しますが、これは出発点となります。

ansible -m python_requirements_info -a dependencies=winrm localhost

内部の失敗メッセージは、管理に使用されるwinrm接続モジュールから送信されます。Windowsホスト使用するつもりがない場合は、チェックしてくださいansible_connection 変数 その他、接続キーワードとインベントリに関連するすべてのもの。 以前はプレイまたはすべてのホスト レベルで Windows 接続をセットアップしていたが、現在は Linux ホストのように見えるものがある可能性があります。

関連情報