#ansible
#ansible
Вопрос:
Я хочу отформатировать диск, если не установлено, что он смонтирован. Для этого у меня есть следующие задачи:
- name: Check if drives are already mounted
shell: df | grep "{{item.drive}}" | wc -l
with_items: "{{disks}}"
register: disks_checked
changed_when: False
- name: output debug
debug: var=disks_checked
- name: Make filesystem
become: yes
filesystem:
fstype: ext4
dev: "{{item.item.drive}}"
opts: -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard"
when: "item.stdout == 0"
with_items: '{{disks_checked.results}}'
Это запуск сборника воспроизведения:
TASK [install-cassandra : Check if drives are already mounted] *********************************************************************************************************************************
ok: [10.142.0.3] => (item={u'directory': u'/var/lib/mysql', u'mount_point': u'/mnt/disks', u'drive': u'/dev/sdb'})
TASK [install-cassandra : output debug] ********************************************************************************************************************************************************
ok: [10.142.0.3] => {
"disks_checked": {
"changed": false,
"msg": "All items completed",
"results": [
{
"_ansible_ignore_errors": null,
"_ansible_item_label": {
"directory": "/var/lib/mysql",
"drive": "/dev/sdb",
"mount_point": "/mnt/disks"
},
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": false,
"cmd": "df | grep "/dev/sdb" | wc -l",
"delta": "0:00:00.005613",
"end": "2019-03-07 09:48:50.293829",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "df | grep "/dev/sdb" | wc -l",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": {
"directory": "/var/lib/mysql",
"drive": "/dev/sdb",
"mount_point": "/mnt/disks"
},
"rc": 0,
"start": "2019-03-07 09:48:50.288216",
"stderr": "",
"stderr_lines": [],
"stdout": "0",
"stdout_lines": [
"0"
]
}
]
}
}
TASK [install-cassandra : Make filesystem] *****************************************************************************************************************************************************
skipping: [10.142.0.3] => (item={'_ansible_parsed': True, 'stderr_lines': [], u'changed': False, u'stdout': u'0', '_ansible_item_result': True, u'delta': u'0:00:00.005613', 'stdout_lines': [u'
0'], '_ansible_item_label': {u'directory': u'/var/lib/mysql', u'mount_point': u'/mnt/disks', u'drive': u'/dev/sdb'}, u'end': u'2019-03-07 09:48:50.293829', '_ansible_no_log': False, 'failed':
False, u'cmd': u'df | grep "/dev/sdb" | wc -l', 'item': {u'directory': u'/var/lib/mysql', u'mount_point': u'/mnt/disks', u'drive': u'/dev/sdb'}, u'stderr': u'', u'rc': 0, u'invocation': {u'mod
ule_args': {u'warn': True, u'executable': None, u'_uses_shell': True, u'_raw_params': u'df | grep "/dev/sdb" | wc -l', u'removes': None, u'argv': None, u'creates': None, u'chdir': None, u'stdi
n': None}}, u'start': u'2019-03-07 09:48:50.288216', '_ansible_ignore_errors': None})
Как вы можете видеть, стандартный вывод равен «0», но при оценке условия when: "item.stdout == 0"
в последней задаче он пропускается, как если бы условие было ложным.
Если я изменю условие на when: "item.stdout == '0'"
, то эта ошибка для последней задачи станет еще более странной:
TASK [install-cassandra : Make filesystem] *****************************************************************************************************************************************************
failed: [10.142.0.3] (...) "module_stderr": "Shared connection to 10.142.0.3 closed.rn"(...)
Почему условие вычисляется не так, как ожидалось? И почему это разрывает соединение во 2-м случае?
Комментарии:
1. Вы проверяли, работает ли задача «Создать файловую систему», если вы вставляете диск вручную? В моем тесте (ansible версии 2.7.5) с общей отладкой сработало ваше второе условие. Кстати, вы можете убрать знак «» вокруг условия.
2. @CERN_Fan спасибо, проверьте мой ответ на вопрос … -_-‘
Ответ №1:
Что ж, как указал CERN_Fan, второе решение должно сработать… Проблема заключалась в кавычках в конце opts
строки… Не могу поверить, что потерял 2 часа на поиски проблемы в других местах.
Я сохраняю ответ и вопрос, потому что ошибка (соединение закрыто) была настолько не связана с проблемой, и кто-то другой мог столкнуться с этим.