Как удалить u из списка ansible

В моей пьесе я пытаюсь получить список имен подкаталогов, используя модуль поиска, а затем извлекая базовое имя из пути. Мне удалось получить список, но перед элементами стоит 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 задачу, чтобы получить желаемый результат?

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку ["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"]

Спасибо. Но когда я запустил его, я получаю эту ошибку 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. Это заставляет меня получить ошибку для того же кода, который работает для вас?

adbdkb 09.02.2023 20:07

Да, добавьте | list между последней картой в to_json. Или лучше обновите Ansible до поддерживаемой версии.

β.εηοιτ.βε 09.02.2023 20:42

Мы можем обновиться только до последней версии 2.9 (точнее, до 2.9.27), мы не можем перейти на более высокую версию ansible - 2.10 или выше. Я уже сделал запрос нашей команде администраторов unix. Будет ли это работать на 2.9.27? Кроме того, я предполагаю, что если конструкция работает на 2.9.27, вместо debug: msg: я мог бы заменить ее на set_fact: dir_list:, а затем использовать ту же конструкцию. Это верно ?

adbdkb 09.02.2023 21:31
cannot go to higher version of ansible - 2.10 or higher <= чем это обосновано? Даже архаичная и полностью устаревшая ОС, такая как centos7, имеет python 3.6, доступный в своих репозиториях по умолчанию, и позволит вам pip3 install ansible в неустаревшей версии либо глобально, либо как пользователь, либо в виртуальной среде. Обратите внимание, что в настоящее время это единственный официально поддерживаемый метод установки.
Zeitounator 09.02.2023 21:56

Я согласен, но, к сожалению, я не могу это контролировать. Проверим в службе безопасности, разрешат ли они администраторам unix обновиться до более высокой версии. Спасибо за ответ

adbdkb 09.02.2023 22:20

Другие вопросы по теме