Ansible не возвращает идентификатор задания для асинхронной задачи

#ansible

Вопрос:

В соответствии с документацией, когда я выполняю асинхронную специальную команду, я должен получить идентификатор задания, чтобы позже проверить состояние. Этого не может быть:

 $ ansible all -a "sleep 60" -P 0 -B 86400
node1 | SUCCESS | rc=-1 >>


node2 | SUCCESS | rc=-1 >>


node0 | SUCCESS | rc=-1 >>


node3 | SUCCESS | rc=-1 >>


$
 

sleep Команда выполняется на всех узлах, поэтому задача выполняется правильно:

 $ ssh node2 ps aux | grep sleep
$ ansible node2 --user ${USER} --background 3600 --poll 0 --args "/bin/sleep 10s"
node2 | SUCCESS | rc=-1 >>


$ ssh node2 ps aux | grep sleep
user  7232  0.0  0.0   7468   744 ?        S    13:54   0:00 /bin/sleep 10s
$
 

Но у меня нет возможности проверить статус async_status работы, так как я не знаю идентификатор работы. Есть ли способ перечислить выполняемые в настоящее время асинхронные задания? Или каким-то другим способом получить удостоверение о работе?

Ubuntu 18.04.1, ansible 2.5.1, python 2.7.17.

Комментарии:

1. job_id имеет значение только в контексте сборника, поскольку специальный режим (запуск ansible сценария) не порождает фоновые процессы, которые переживают саму ansible команду, и, следовательно, нет задания с идентификатором, который можно было бы проверить позже

2. Если вы используете эту -B опцию, то процесс действительно переживет ansible команду. В документации, на которую я ссылался, есть раздел «Асинхронные специальные задачи», в котором говорится, что для проверки статуса задания необходимо использовать идентификатор задания.

3. После вашего обновления мне интересно, подключаетесь ли вы через ssh целевой хост и выполняете ли команду ansible там, подключаясь к себе? Каким будет результат ansible node2 --user ${USER} --module-name shell --args "ps aux | grep sleep" ?

4. Да, это отлично работает: $ ansible node2 --user ${USER} --module-name shell --args echo test; echo rc=$?" вывод node2 | SUCCESS | rc=0 >> test rc=0 (новые строки удалены).

5. Не уверен, было ли это вашим намерением, но exit -1 возвращает ошибку, которую ansible распознает правильно: ansible node2 --user ${USER} --module-name shell --args "echo 'test '; exit -1;" выводит node2 | FAILED | rc=2 >> test /bin/sh: 1: exit: Illegal number: -1non-zero return code

Ответ №1:

В соответствии с вашими выводами код возврата rc=-1 и команда sleep только без полного пути.

В системе RHEL7.9.9 с Ansible 2.9.25 и Python 2.7.5 вывод асинхронной специальной задачи для пользователя выглядит следующим образом

 ansible test --user ${USER} --ask-pass --background 3600 --poll 0 --args "/usr/bin/sleep 1m"
SSH password:
test1.example.com | CHANGED => {
    "ansible_job_id": "211363790122.167971",
    "changed": true,
    "finished": 0,
    "results_file": "/home/test/.ansible_async/211363790122.167971",
    "started": 1
}
test2.example.com | CHANGED => {
    "ansible_job_id": "289811848480.63295",
    "changed": true,
    "finished": 0,
    "results_file": "/home/test/.ansible_async/289811848480.63295",
    "started": 1
}
 

и для суперпользователя, такого как

 ansible test --user ${USER} --ask-pass --become --background 3600 --poll 0 --args "/usr/bin/sleep 1m"
SSH password:
test1.example.com | CHANGED => {
    "ansible_job_id": "494650580974.167671",
    "changed": true,
    "finished": 0,
    "results_file": "/root/.ansible_async/494650580974.167671",
    "started": 1
}
test2.example.com | CHANGED => {
    "ansible_job_id": "273855897479.62987",
    "changed": true,
    "finished": 0,
    "results_file": "/root/.ansible_async/273855897479.62987",
    "started": 1
}
 

Вы можете выполнить некоторые тесты с помощью нескольких различных специальных команд, таких как

 ansible test --user ${USER} --ask-pass --args "python --version"
SSH password:
test1.example.com | CHANGED | rc=0 >>
Python 2.7.5
test2.example.com | CHANGED | rc=0 >>
Python 2.7.5
 

с полным путем и без него и так далее. А также из-за rc=-1

 ansible test --user ${USER} --ask-pass --module-name shell --args "echo test; echo rc=$?"
test1.example.com | CHANGED | rc=0 >>
test
rc=0

ansible test --user ${USER} --ask-pass --module-name shell --args "echo 'test '; exit -1;"
test1.example.com | FAILED | rc=255 >>
test non-zero return code
 

Комментарии:

1. Вы хотите сказать, что rc=-1 означает, что команда не началась? Я добавил вывод, который демонстрирует, что sleep запускается, как и ожидалось.

2. @user252164, успешная специальная команда обычно возвращает код возврата CHANGED | rc=0 >> 1 или -1 указывает на ошибку. Однако у меня недостаточно информации о вашем окружении. После вашего обновления мне интересно, подключаетесь ли вы через ssh целевой хост и выполняете ли команду ansible там, подключаясь к себе?

3. Нет, я вызываю ansible node0 для запуска sleep на node2.