Как добавить в список, где добавляемая строка динамически создается в пьесе - PullRequest
1 голос
/ 01 мая 2020

Выдернуть мои волосы. Я знаю, что сделал это 10 * 1034 годами с более старыми версиями ansible. Я почти не трогал ansible, поэтому не помню, как я это сделал. На первый взгляд это кажется смехотворно простым, так что, очевидно, что-то глупое, что я упускаю из виду.

Учитывая пример инвентаризации, ничего особенного:

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

[nodes]
foo1
foo2
foo3

[all:vars]
minio_proto=http
disks_per_node=64

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

Вы запускаете сервер, указав все узлы и пути к дискам:

minio server http://foo1/data/disk{0...79} http://foo2/data/disk{0...63} http://foo3/data/disk{0...63} 

Так что в моей игре мне нужно построить эту строку, которая в итоге будет передана команде оболочки, чтобы запустить сервер на каждом узле.

Итак, у меня есть книга игр (в конечном итоге это будет роль), которая будет запущена один раз, а не для каждого хоста, просто для создания этого параметра сервера.

I ' Я перепробовал так много разных вещей, что я не могу перечислить их все, но вот лишь один из моих последних уловок:

---
- hosts: all
  gather_facts: false
  become: true
  ignore_errors: false
  vars:
    minio_startup1: []
    minio_startup2: []
  tasks:
  - name: Verifying hosts are up and we can become root
    become: true
    ping:
 # THIS WORKS FINE, APPENDING A SIMPLE VARIABLE WORKS
  - name: Building minio startup parameter
    set_fact:
      minio_startup1: "{{ minio_startup1 + [item] }}"
    with_items:
      - "{{ ansible_play_hosts }}"
  - debug: var=minio_startup1
 # DOING STUFF LIKE THIS DOES NOT WORK
  - name: Building minio startup parameter
    set_fact:
      minio_startup2: "{{ minio_startup2 }} + [{{ minio_proto }}//{{ item }}/data{0...{{ disks_per_node|int - 1 }}}] }}"
    with_items:
      - "{{ ansible_play_hosts }}"
  - debug: var=minio_startup2

В основном на этом этапе в книге воспроизведения я хочу список, который выглядит следующим образом:

[ 'http://foo1/data{0...63}', 'http://foo2/data{0...63}', 'http://foo2/data{0...63}']

Затем, позже, в сборнике пьес, я могу объединить это в одну строку и передать свой контейнер minio с помощью команды оболочки:

{{ minio_startup|join(' ') }}

Я знаю, что делал это годами go, но после 3 часов стягивания волос это ускользает от меня.

* ОБНОВЛЕНИЕ *

Ну, я нашел способ, не уверен, что это лучше. Если интересно, это то, что я сделал. Похоже, вы можете использовать '~' для объединения элементов внутри []. Мне все еще приходилось делать математику определения конечного номера диска в отдельной переменной. (disk_ending_index)

      minio_startup2: "{{ minio_startup2  + [ minio_proto ~ '//' ~ item ~ '/data{0...' ~ disk_ending_index ~ '}' ] }}"

1 Ответ

0 голосов
/ 01 мая 2020

Использовать Стиль в кавычках . В пьесе ниже

- hosts: foo1:foo2:foo3
  gather_facts: false
  vars:
    minio_proto: http
    disks_per_node: 64
    minio_startup: []
  tasks:
    - set_fact:
        minio_startup: '{{ minio_startup +
                           [minio_proto ~ "://" ~  item ~
                           "/data{0.." ~ disks_per_node ~ "}"] }}'
      loop: "{{ ansible_play_hosts }}"
      run_once: true
    - debug:
        var: minio_startup
      run_once: true
    - debug:
        msg: "{{ minio_startup|join(' ') }}"
      run_once: true

приведены (сокращенно)

ok: [foo1] => {
    "minio_startup": [
        "http://foo1/data{0..63}",
        "http://foo2/data{0..63}",
        "http://foo3/data{0..63}"
    ]
}

ok: [foo1] => {
    "msg": "http://foo1/data{0..63} http://foo2/data{0..63} http://foo3/data{0..63}"
}

Цитирование из Стиль в одинарных кавычках :

... символы "\" и "" "могут использоваться свободно. Это ограничивает скаляры в одинарных кавычках печатными символами ...

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