【问题标题】:How to combine json dictionary and lists in jinja template如何在 jinja 模板中结合 json 字典和列表
【发布时间】:2016-12-05 23:26:37
【问题描述】:

这是我在Ansible, Boto, AWS - Invalid type for parameter containerDefinitions[0].memory 收到的出色答案的后续。

我不明白如何正确组合提供的答案。

在我原来的 ansible/roles/ecs_cluster_init/tasks/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 }}"

适用于没有入口点的服务的初始答案是:

- 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 键的答案是:

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 文件中结合这两者。如何将 entryPoint 和后续 logConfiguration 列表放入容器字典中?

【问题讨论】:

    标签: json ansible jinja2


    【解决方案1】:

    如果您使用 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 }}"
    

    【讨论】:

    • 我绝对更喜欢简单的方法,但在使用memory: "{{ item.memory|int|abs|int }}" 时仍然收到“无效类型”错误消息。
    • 使用“硬方式”我收到错误template error while templating string: unexpected char u'\\u200c'。 200 是内存值,但我不确定以下“c”来自哪里,除非模板/过滤器添加了它。
    • \u200c is a zero width non joiner。这可能是复制和粘贴的产物。我现在正在调查。
    • 看起来复制粘贴带来了一些超级怪异的控制字符。最后一次更新应该(希望)有助于解决这些问题。
    • 另外,@DaemonofChaos:你使用的是什么版本的 ansible?
    猜你喜欢
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2021-06-30
    • 2021-04-09
    • 2018-05-28
    • 2012-11-13
    • 2021-12-29
    相关资源
    最近更新 更多