Как использовать переменные в with_items в anisble playbook

У меня есть создание заданной роли для создания нескольких лямбда-функций, где я передаю некоторые параметры из файла переменных. Мой переменный файл выглядит так

Переменный файл

S3BucketName: "test_bucket"
S3Key1: "test.zip"
runtime: "python3.6"
handler1: "test.lambda_handler"
role1: "test_role_arn"
memory_size: "128"
timeout: "180"
s3_key2: "temp.zip" 
role2: "temp_role_Arn"
handler2: "temp.lambda_handler" 

В моей пьесе я использую ANSIBLE Loop для одновременного создания нескольких лямбда-функций aws. когда я использую переменную в with_items.

Файл Playbook

- hosts: localhost
  roles:
    - ansible-lambda
  vars_files:
    - "ansible-lambda/vars/cf_vars.yaml" 
    lambda:
        name: '{{ item.name }}'
        region: "{{ aws_region }}" 
        state: "{{state}}" 
        runtime: "{{ runtime }}" 
        timeout: "{{timeout}}"
        memory_size : "{{memory_size}}"
        s3_bucket: "{{ S3BucketName}}"
        s3_key: '{{ item.s3_key }}'
        role: '{{ item.role }}'
        handler: '{{ item.handler }}' 
    with_items:
         - name: test
           s3_key: "{{ S3Key1 }}" #refering to variable 1 
         - name: temp
           s3_key: "{{ S3Key2 }}" #refering to variable 2
    - debug:
        msg: "Lambda creation Complete!!"

Ниже приводится ошибка:

роковой: [localhost]: не удалось! => {"msg": "S3Key1'не определен"}

Этот playbook работает, когда я передаю абсолютные значения вместо переменных. Я имею в виду s3_key: test.zip

как использовать переменные в с элементом?

1 ответ

-------------- var file ---------------
aws_region: austin
lambda_list:
  - name: lambda1
    state: "UR STATE HERE"
    S3BucketName: "test_bucket"
    S3Key: "test.zip"
    runtime: "python3.6"
    handler: "test.lambda_handler"
    role_desc: "test_role_arn"
    memory_size: "128"
    timeout: "180"

  - name: lambda2
    state: "UR STATE HERE"
    S3BucketName: "test_bucket"
    S3Key: "test2.zip"
    runtime: "python2.7"
    handler: "test.lambda_handler"
    role_desc: "test_role_ARN"
    memory_size: "256"
    timeout: "150"
---------------playbook------------------------ 
- hosts: localhost
  vars_files: "ansible-lambda/vars/cf_vars.yaml"
  tasks:
    lambda:
      name: '{{ item.name }}'
      region: "{{ aws_region }}"
      state: "{{ item.state }}"
      runtime: "{{ item.runtime }}"
      timeout: "{{ item.timeout }}"
      memory_size : "{{ item.memory_size }}"
      s3_bucket: "{{ item.S3BucketName }}"
      s3_key: "{{ item.s3_key }}"
      role: "{{ item.role_desc }}"
      handler: "{{ item.handler }}"
    with_items:
    - "{{ lambda_list }}" 

Вот фрагмент правильного пути ИМХО, как добиться того, что вы пытаетесь сделать, конечно, есть несколько других способов, но чтобы быть и эффективным, и простым в настройке, в приведенном выше примере, вы можете увидеть, что есть dict, который хранит информацию о каждой лямбде в виде ключ, когда вы используете with_items, он повторяет каждый ключ к задаче, используя данные элемента как {{ item.name }},

Вы могли бы даже поместить dict/list в dict. для примера:

lambda_list:
  - name: lambda1 # <--- each dash('-') is a key with a value, that value is a dict
    S3: #
      S3BucketName: "test_bucket"
      S3Key: "test.zip"

  - name: lambda2
    S3: # <-- without the dash its indicated as a list inside the dict.
      S3BucketName: "test_bucket"
      S3Key: "test2.zip"

в этом случае для доступа к вашему вложенному списку вы должны использовать {{ item.S3.S3BucketName }} или {{ item['S3']['S3BucketName'] }}

если бы это был дикт в диктовке, вы бы получили ключ / значение каждого ключа без надлежащего способа доступа к определенному ключу (с помощью циклов вы можете повторять дикт и использовать "когда", чтобы получить нужный ключ).

Вот несколько ссылок, которые стоит прочитать о циклах, диктах и ​​способах доступа к ним.

http://ansible-docs.readthedocs.io/zh/stable-2.0/rst/playbooks_loops.html

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