Как использовать переменные в 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