В моей пьесе я пытаюсь получить список имен подкаталогов, используя модуль поиска, а затем извлекая базовое имя из пути. Мне удалось получить список, но перед элементами стоит u'
. Как я могу удалить их из вывода?
Ансибл версия 2.9
Я пытался просмотреть эти ТАК посты здесь и здесь, но не смог заставить это работать.
Я, возможно, не совсем понял, как их следует применять
Это часть моей пьесы:
- name: set item.path | basename
set_fact: dir_name_list2_basename = "{{ item.path | basename}}"
with_items: "{{ zookeeper_data_dir.files}}"
register: item_path_basename_list
- debug:
msg: "{{item_path_basename_list.results}}"
- name: debug item.path | basename as list
debug:
var: item.ansible_facts.dir_name_list2_basename
with_items: "{{item_path_basename_list.results}}"
- debug: msg = "item_path_basename_list.results {{ item_path_basename_list.results | map(attribute='ansible_facts.dir_name_list2_basename') | list }}"
- name: set fact to array
set_fact: basename_array = "{{ item_path_basename_list.results | map(attribute='ansible_facts.dir_name_list2_basename') | list }}"
- debug:
msg: "basename_array &&&&&&&& {{basename_array}}"
А это результат последнего debug
:
ok: [zk3-dev] => {
"msg": "basename_array &&&&&&&& [u'version-2_backup', u'version-2']"
}
ok: [zk2-dev] => {
"msg": "basename_array &&&&&&&& [u'version-2_backup', u'version-2']"
}
ok: [zk1-dev] => {
"msg": "basename_array &&&&&&&& [u'version-2_backup', u'version-2']"
}
Я хотел бы, чтобы basename_array
отображался как ["version-2_backup", "version-2"]
без префикса u
Как мне изменить свою set fact to array
задачу, чтобы получить желаемый результат?
Поскольку ["version-2_backup", "version-2"]
на самом деле является массивом JSON, вы можете использовать фильтр to_json.
При этом ваш длинный набор задач выглядит слишком сложным процессом для требования, которое может быть достигнуто с помощью правильного набора фильтров карты, поскольку карта может применять один и тот же фильтр ко всем элементам списка, вы можете легко соответствовать ваш basename
в нем.
Итак, учитывая:
- debug:
msg: >-
basename_array &&&&&&&&
{{
zookeeper_data_dir.files
| map(attribute='path')
| map('basename')
| to_json
}}
Это дает:
ok: [localhost] => {
"msg": "basename_array &&&&&&&& [\"version-2_backup\", \"version-2\"]"
}
Обратите внимание, что двойные кавычки экранированы, потому что вы используете обратный вызов JSON stdout. Но если вы измените обратный вызов на YAML, это даст именно то, что вы ожидали:
ok: [localhost] =>
msg: basename_array &&&&&&&& ["version-2_backup", "version-2"]
Да, добавьте | list
между последней картой в to_json. Или лучше обновите Ansible до поддерживаемой версии.
Мы можем обновиться только до последней версии 2.9 (точнее, до 2.9.27), мы не можем перейти на более высокую версию ansible - 2.10 или выше. Я уже сделал запрос нашей команде администраторов unix. Будет ли это работать на 2.9.27? Кроме того, я предполагаю, что если конструкция работает на 2.9.27, вместо debug: msg:
я мог бы заменить ее на set_fact: dir_list:
, а затем использовать ту же конструкцию. Это верно ?
cannot go to higher version of ansible - 2.10 or higher
<= чем это обосновано? Даже архаичная и полностью устаревшая ОС, такая как centos7, имеет python 3.6, доступный в своих репозиториях по умолчанию, и позволит вам pip3 install ansible
в неустаревшей версии либо глобально, либо как пользователь, либо в виртуальной среде. Обратите внимание, что в настоящее время это единственный официально поддерживаемый метод установки.
Я согласен, но, к сожалению, я не могу это контролировать. Проверим в службе безопасности, разрешат ли они администраторам unix обновиться до более высокой версии. Спасибо за ответ
Спасибо. Но когда я запустил его, я получаю эту ошибку
FAILED! => {"msg": "Unexpected templating type error occurred on (basename_array {{\n zookeeper_data_dir.files\n | map(attribute='path')\n | map('basename')\n | to_json\n}}): <generator object do_map at 0x7f6395cf2a50> is not JSON serializable"}
- Моя доступная версия 2.9.7. Это заставляет меня получить ошибку для того же кода, который работает для вас?