2016-12-05 91 views
1

這是我在Ansible, Boto, AWS - Invalid type for parameter containerDefinitions[0].memory中收到的優秀答案的後續。我不理解如何正確地組合提供的答案。如何在jinja模板中結合json字典和列表

我在原來的ansible /角色/ ecs_cluster_init /任務/ main.yaml文件我有:

## ECS Task and Service Definitions 
- block: 
    - name: Create ECS Service1 Task Definitions 
     ecs_taskdefinition: 
     region: "{{ region }}" 
     containers: 
      - name: "{{ item.name }}" 
      cpu: 0 
      essential: true 
      image: "{{ item.image }}" 
      memory: "{{ item.memory|int|abs }}" 
      mountPoints: "{{ item.mounts }}" 
      environment: "{{ item.env_vars }}" 
      portMappings: "{{ item.portmap }}" 
      entryPoint: 
       - "java" 
       - "-Xms{{ java_heap_size_initial }}" 
       - "-Xmx{{ java_heap_size_max }}" 
       - "-DlogDir=/host" 
       - "-Dcom.sun.net.ssl.checkRevocation=false" 
       - "-jar" 
       - "/app.jar" 
      logConfiguration: 
       logDriver: "{{ ecs_task_log_configuration.logDriver }}" 
       options: 
       max-size: "{{ ecs_task_log_configuration.options.max_size }}" 
       max-file: "{{ ecs_task_log_configuration.options.max_file }}" 
     family: "{{ service_prefix }}-{{ item.name }}-{{ env_name }}" 
     state: present 
     increment_revision: true 
     volumes: "{{ item.volumes }}" 
     register: service1_task_definition 
     with_items: "{{ ecs_task_definitions }}" 

,對於沒有爲entryPoint服務工作的初步答案是要做到:

- name: Create ECS Service1 Task Definitions 
    ecs_taskdefinition: 
    region: "{{ region }}" 
    containers: "{{'['+dict(name=item.name, cpu=0, image=item.image, memory=item.memory|int)|to_json+']'}}" 
    with_items: "{{ ecs_task_definitions }}" 

和如何處理入口點鍵的答案是:

entryPoint=('jav‌​a^-Xms'+java_heap_size_initial+'^-Xmx'+jav‌​a_heap_size_max+'^-D‌​logDir=/host^-Djava.‌​security.egd=file:/d‌​ev/./urandom^-D‌​com‌​.sun.net.ssl.chec‌​k‌​Revocation=false^-j‌‌​​ar^/app.jar').split‌​(‌​'^') 

我沒有得到的是如何在我的ansible/roles/ecs_cluster_init/tasks/main.yaml文件中結合這兩者。如何將入口點和後續的logConfiguration列表放入容器字典中?

回答

2

如果你是ansible≥1.8.4或可以升級到該版本(https://github.com/ansible/ansible/issues/5865),你可以加引號memory

memory: "{{ item.memory|int|abs|int }}" 

但是,如果你想這個做硬盤的方式:

- name: Create ECS Service1 Task Definitions 
    ecs_taskdefinition: 
    region: "{{ region }}" 
    containers: "{{'['+dict(name=item.name, cpu=0, image=item.image, memory=item.memory, entryPoint=[ 'java', '-Xms'+java_heap_size_initial, '-Xmx'+java_heap_size_max, '-DlogDir=/host', '-Djava.security.egd=file:/dev/./urandom', '-Dcom.sun.net.ssl.checkRevocation=false', '-jar', '/app.jar' ], logConfiguration=dict(logDriver=ecs_task_log_configuration.logDriver, options={ 'max-size': ecs_task_log_configuration.options.max_size, 'max-file': ecs_task_log_configuration.options.max_file}))|to_json+']'}}" 
    with_items: "{{ ecs_task_definitions }}" 
+0

我絕對更喜歡簡單的方法,但使用'memory:{{item.memory | int | abs | int}}''時仍然收到「Invalid Type」錯誤信息。 –

+0

使用「困難的方式」,我收到錯誤模板字符串模板錯誤:意外字符u'\\ u200c''。 200是內存值,但我不確定下面的「c」來自哪裏,除非模板/過濾器添加了該值。 –

+0

'\ u200c是一個零寬度非木匠'。這可能是複製和粘貼的人工產物。我現在正在研究它。 – 2ps

相關問題