Значение переменной для другой переменной ansible - PullRequest
0 голосов
/ 27 июня 2019

Извините, если внутри переменной много постов о переменных, мой вариант использования отличается.Попытка получить доступ к элементу из списка переменных "efs_list" на основе номера индекса текущего хоста.В инвентаре есть три хоста

  vars:
    efs_list:
      - efs1
      - efs2
      - efs3
    sdb_index: "{{ groups['all'].index(inventory_hostname) }}" 

Значения должны быть следующими: host1-efs1 host2- efs2 host3- efs3

Попытка доступа к нему через efs_list. {{Sdb_index}} для - debug: var=efs_list.{{ sdb_index }} вывод соответствует назначению

ok: [10.251.0.174] => {
    "efs_list.0": "efs1"
}
ok: [10.251.0.207] => {
    "efs_list.1": "efs2"
}
ok: [10.251.0.151] => {
    "efs_list.2": "efs3"
}

Но для

     - debug:
        msg: "{{ efs_list.{{ sdb_index }} }}"

fatal: [10.251.0.174]: FAILED! => {"msg": "template error while templating string: expected name or number. String: {{ efs_list.{{ sdb_index }} }}"}

---
- name: SDB Snapshots Creation
  hosts: all
  remote_user: "centos"
  become: yes
  vars:
    efs_list:
      - efs1
      - efs2
      - efs3
    sdb_index: "{{ groups['all'].index(inventory_hostname) }}" 

  tasks:
    - debug: var=efs_list.{{ sdb_index }}

    - debug:
        msg:  "{{ efs_list.{{ sdb_index }} }}"

    - name: Get  Filesystem ID
      become: false
      local_action: command aws efs describe-file-systems --creation-token "{{ efs_list.{{ sdb_index }} }}"
         --region us-east-1 --query FileSystems[*].FileSystemId --output text  
      register: fs_id

Он должен приписывать элемент списка текущему индексу enter code here

1 Ответ

0 голосов
/ 27 июня 2019
Фильтр

extract выполнит эту работу. Входные данные фильтра должны быть списком индексов и контейнером (в данном случае массивом). Задачи ниже

- set_fact:
    sdb_index: "{{ [] + [ groups['all'].index(inventory_hostname) ] }}"
- debug:
    msg: "{{ sdb_index|map('extract', efs_list)|list }}"

дают

ok: [host1] => {
    "msg": [
        "efs1"
    ]
}
ok: [host2] => {
    "msg": [
        "efs2"
    ]
}
ok: [host3] => {
    "msg": [
        "efs3"
    ]
}

Если хосты не отсортированы в инвентаре, необходимо отсортировать их в игре

- set_fact:
    my_hosts: "{{ groups['all']|sort }}"
- set_fact:
    sdb_index: "{{ [] + [ my_hosts.index(inventory_hostname) ] }}"
- debug:
    msg: "{{ sdb_index|map('extract', efs_list)|list }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...