Невозможно назначить значение по умолчанию для зарегистрированной переменной Ansible на основе условия - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь получить дату модификации, используя команду модуля ansible shell

stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3

Примечание: выходные данные оболочки, т.е. starttime.rc, всегда будут истинными, т.е. 0 независимо от того, возвращен ли результат из-за конвейера или нетcut -d в команде.

Я хочу отобразить время, т.е. результат модуля оболочки, если он вернет вывод, в противном случае отобразится «Сервер НЕ РАБОТАЕТ».

Вот моя книга игр:

- hosts: test_test
  any_errors_fatal: true
  user: user1
  gather_facts: false
  tasks:
    - shell: "stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3"
      register: starttime

    - name: Status of Server
      set_fact:
        starttime: "{{ starttime | default('Server NOT RUNNING') }}"

    - debug:
        msg: "STARTTIME:{{ starttime }}"

Ниже приведен подробный вывод, в котором я не получаю ожидаемых результатов.

TASK [shell] ************************************************************************************************************************************************
changed: [10.9.9.111] => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "cmd": "stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3",
    "delta": "0:00:00.118151",
    "end": "2019-11-08 10:46:28.345448",
    "invocation": {
        "module_args": {
            "_raw_params": "stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3",
            "_uses_shell": true,
            "argv": null,
            "chdir": null,
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "stdin_add_newline": true,
            "strip_empty_ends": true,
            "warn": true
        }
    },
    "rc": 0,
    "start": "2019-11-08 10:46:28.227297",
    "stderr": "stat: cannot stat â/proc/1178/statâ: No such file or directory",
    "stderr_lines": [
        "stat: cannot stat â/proc/1178/statâ: No such file or directory"
    ],
    "stdout": "",
    "stdout_lines": []
}

TASK [Status of Server] ****************************************************************************************************************************
task path: /app/script/condition_test.yml:14
ok: [10.9.9.111] => {
    "ansible_facts": {
        "starttime": {
            "ansible_facts": {
                "discovered_interpreter_python": "/usr/bin/python"
            },
            "changed": true,
            "cmd": "stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3",
            "delta": "0:00:00.118151",
            "end": "2019-11-08 10:46:28.345448",
            "failed": false,
            "rc": 0,
            "start": "2019-11-08 10:46:28.227297",
            "stderr": "stat: cannot stat â/proc/1178/statâ: No such file or directory",
            "stderr_lines": [
                "stat: cannot stat â/proc/1178/statâ: No such file or directory"
            ],
            "stdout": "",
            "stdout_lines": []
        }
    },
    "changed": false
}

TASK [debug] ************************************************************************************************************************************************
task path: /app/script/condition_test.yml:19
ok: [10.9.9.111] => {
    "msg": "STARTTIME:{'stderr_lines': [u'stat: cannot stat \\u2018/proc/1178/stat\\u2019: No such file or directory'], u'changed': True, u'end': u'2019-11-08 10:46:28.345448', u'stdout': u'', u'cmd': u\"stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3\", u'rc': 0, u'start': u'2019-11-08 10:46:28.227297', 'failed': False, u'stderr': u'stat: cannot stat \\u2018/proc/1178/stat\\u2019: No such file or directory', u'delta': u'0:00:00.118151', 'stdout_lines': [], 'ansible_facts': {u'discovered_interpreter_python': u'/usr/bin/python'}}"
}
META: ran handlers
META: ran handlers

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

Не могли бы вы подсказать, как мне справиться с этим?

1 Ответ

1 голос
/ 08 ноября 2019

Примечание: выходные данные оболочки, то есть starttime.rc, всегда будут иметь значение true, т. Е. 0 независимо от того, возвращен ли результат или нет из-за отрезания трубы в команде.

Oneможет легко обойти это с помощью set -o pipefail (что может потребовать обновления shell: для использования bash или другой «современной» оболочки)

- shell: "set -o pipefail; stat /proc/1178/stat | grep Modify  | cut -d' ' -f2,3"
  register: starttime

Другим совершенно разумным подходом было бы на самом деле проверить, что файл существует:

- shell: |
    if [ ! -e {{fn}} ]; then exit 1; fi
    stat {{fn}} | grep Modify | cut -d' ' -f2,3
  vars:
    fn: /proc/1178/stat
  register: starttime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...