
며칠 전부터 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
오류에서 알 수 있듯이 Python 모듈 winrm 또는 요청을 Ansible이 컨트롤러에서 사용하는 Python에 설치합니다.
추가 문제를 해결하기 위해 이 명령은 winrm 모듈을 찾으려고 시도하고 Python 경로도 인쇄합니다. 기술적으로는 Python 플러그인과 다를 수 있는 Python 모듈을 사용하지만 이것이 출발점입니다.
ansible -m python_requirements_info -a dependencies=winrm localhost
내부 실패 메시지는 관리하는 데 사용되는 winrm 연결 모듈에서 나옵니다.Windows 호스트. 이 기능을 사용할 의도가 없었다면 확인하세요.ansible_connection 변수 그리고 연결 키워드 및 인벤토리와 관련된 모든 것. 이전에는 플레이 또는 모든 호스트 수준에서 Windows 연결을 설정했지만 이제는 Linux 호스트처럼 보이는 것이 있을 수 있습니다.