如何在不同的剧本

时间:2018-04-12 12:33:15

标签: ansible aws-lambda ansible-2.x ansible-role

我创建了ansible角色来创建多个lambda函数,我从变量文件传递一些参数。我的变量文件看起来像

变量文件

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循环同时创建多个aws lambda函数。当我在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'未定义”}

当我传递绝对值而不是变量时,这个剧本可行。我的意思是 s3_key:test.zip

如何在项目中使用变量?

1 个答案:

答案 0 :(得分:0)

-------------- 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 }}" 

这里有一个正确的方式片段恕我直言如何实现你想要做的事情,确保除了在上面的例子中有效和简单配置之外,还有其他几种方法,你可以看到&# 39; sa dict将每个lambda的信息保存为关键词,当你使用with_items时,它会将每个键迭代到任务,同时将项目的数据用作{{ item.name }}

你甚至可以在字典中输入一个字典/列表。例如:

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 [&#39; S3&#39;] [&#39; S3BucketName&#39;]}} < / p>

如果它是dict中的dict,你将得到每个键的键/值而没有正确的方法来访问特定的键(使用循环你可以迭代dict并使用&#39;当&#39;得到想要的钥匙。)

这里有一些值得一读的关于循环,dicts以及如何访问它们的参考资料。

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