내가 보는 건Ansible dnf 모듈실패하다. 그러나 그것은 신뢰할 수 없습니다. 실패했을 때 다시 Ansible을 실행하면 성공하는 것 같습니다.
내 시스템은 Fedora 29 Workstation입니다. (자세한 버전 정보는 아래에서 확인하세요)
스크립트에서 Ansible을 실행하고 있습니다. 로컬 연결을 사용합니다.sudo ansible-playbook -c local ...
$ ./localhost alan-laptop playbooks/alan-laptop.yml
[sudo] password for alan-sysop:
[DEPRECATION WARNING]: The use of 'static' has been deprecated. Use
'import_tasks' for static inclusion, or 'include_tasks' for dynamic inclusion.
This feature will be removed in version 2.12. Deprecation warnings can be
disabled by setting deprecation_warnings=False in ansible.cfg.
PLAY [alan-laptop] *************************************************************
TASK [Gathering Facts] *********************************************************
ok: [alan-laptop]
TASK [repos-fedora : Check OS is Fedora] ***************************************
ok: [alan-laptop] => {
"changed": false,
"msg": "All assertions passed"
}
TASK [repos-fedora : Configure Fedora repos using local cache] *****************
changed: [alan-laptop]
TASK [repos-fedora : Test "dnf check-update"] **********************************
changed: [alan-laptop]
TASK [sourcejedi.etckeeper : Install epel repo (needed for Centos)] ************
skipping: [alan-laptop]
TASK [sourcejedi.etckeeper : Install etckeeper] ********************************
fatal: [alan-laptop]: FAILED! => {"changed": false, "module_stderr": "<stdin>:17: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses\n", "module_stdout": "[master df9553e] saving uncommitted changes in /etc prior to dnf run\n Author: Alan Jenkins <[email protected]>\n 5 files changed, 79 insertions(+), 48 deletions(-)\n\n{\"msg\": \"Nothing to do\", \"changed\": false, \"results\": [\"Installed: etckeeper\"], \"rc\": 0, \"invocation\": {\"module_args\": {\"name\": [\"etckeeper\"], \"state\": \"present\", \"allow_downgrade\": false, \"autoremove\": false, \"bugfix\": false, \"disable_gpg_check\": false, \"disable_plugin\": [], \"disablerepo\": [], \"download_only\": false, \"enable_plugin\": [], \"enablerepo\": [], \"exclude\": [], \"installroot\": \"/\", \"install_repoquery\": true, \"security\": false, \"skip_broken\": false, \"update_cache\": false, \"update_only\": false, \"validate_certs\": true, \"conf_file\": null, \"disable_excludes\": null, \"list\": null, \"releasever\": null}}}\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 0}
[...]
"변경" 작업이 중요할 것 같습니다. 이 작업은 내 dnf 저장소 파일을 설치(및 확인)합니다. 즉, Ansible을 다시 실행하면 이러한 작업은 자연스럽게 "변경"되지 않습니다. 작업을 강제로 "변경"하기 위해 저장소 파일을 지워 보았습니다. 처음으로 이것은 dnf 모듈의 결함을 재현하는 것 같습니다. 하지만 지금까지 여러 번 시도했지만 항상 결함을 재현할 수는 없습니다.
"MODULE FAILURE\nSee stdout/stderr for the 특정 오류"라는 메시지는 어딘가에 실제 오류 메시지가 있어야 한다는 뜻이지만 그게 무엇인지는 모르겠습니다. Ansible dnf 모듈에 버그가 있습니까? 즉, 실제 오류를 보고하지 않는다는 의미입니까? 확실히 지원 중단 경고는 실제 오류가 아닙니다. 어쨌든 발생하지만 실제 오류가 있는 경우에만 표시됩니까?
왜 실패했나요?
관련성이 있는 것 같
module_stdout
나요 ?~해야 한다유효한 JSON이지만 etckeeper의 Git 메시지와 혼합되어 있습니까? 나는 그것이 원인이라고 생각하지 않습니다. 왜냐하면 때로는 dnf 모듈이 하기 때문입니다.아니요예제에 표시된 대로 커밋되지 않은 변경 사항이 있어도 실패합니다sudo etckeeper vcs diff
.또한 이것이 PackageKit과 충돌할 수도 있다고 생각했지만...
확인해 보니 , 또는 내 전체 Ansible 플레이북과 충돌이 없는 것 같습니다
pkcon refresh force
. 둘은 심지어 손을 잡고있는 것 같습니다.sudo dnf check-update --refresh
sudo dnf install etckeeper
sudo ansible localhost -m dnf -a "name=etckeeper state=present"
또한 이후에도 여전히 이러한 실패가 발생합니다
systemctl mask --now --runtime packagekit.service
. (다시 확인해 보니 오류가 발생했을 때 서비스가 실행되고 있지 않았습니다.)
$ ansible --version
ansible 2.7.9
config file = /home/alan-sysop/ansible/ansible.cfg
configured module search path = ['/home/alan-sysop/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.7.2 (default, Mar 21 2019, 10:09:12) [GCC 8.3.1 20190223 (Red Hat 8.3.1-2)]
$ rpm -q ansible
ansible-2.7.9-1.fc29.noarch
답변1
module_stdout
Q: 유효한 JSON이어야 할 것 같지만 etckeeper의 Git 메시지와 혼합되어 있습니다. 관련이 있나요?
ㅏ.예.
Ansible 모듈 [...]은 종료하기 전에 JSON 문자열을 stdout에 인쇄하여 ansible에 정보를 반환합니다.
문제는 여는 대괄호로 시작하는 etckeeper의 메시지로 인해 특히 발생합니다.
[master df9553e] saving uncommitted changes in /etc prior to dnf run
Author: Alan Jenkins <[email protected]>
5 files changed, 79 insertions(+), 48 deletions(-)
Ansible은 json이 아닌 헤더 라인을 자동으로 건너뛰어 유사한 문제를 해결하는 것을 목표로 합니다. [
그러나 JSON 문서를 시작하는 데 유효한 문자가 있습니다. 바라보다 lib/ansible/module_utils/json_utils.py
:
def _filter_non_json_lines(data):
'''
Used to filter unrelated output around module JSON output, like messages from
tcagetattr, or where dropbear spews MOTD on every single command (which is nuts).
Filters leading lines before first line-starting occurrence of '{' or '[', and filter all
trailing lines after matching close character (working from the bottom of output).
'''