2016-12-01 9 views
0

Amazon ECSのドッキング・コンテナで実行されている複数のサービスがあり、各サービスの合計システム・メモリのパーセンテージを割り当てています。私は次のエントリを持っている私のansible /役割/ ecs_cluster_init /デフォルト/ main.yamlファイルで不可能なBoto、AWS - パラメータcontainerDefinitions [0]の無効なタイプ.memory

docker_memory_limit_service1: 17 
docker_memory_limit_service2: 12 
docker_memory_limit_service3: 16 
docker_memory_limit_service4: 10 
docker_memory_limit_service5: 16 
docker_memory_limit_service6: 10 
total_system_memory : 2048 

サービス4はわずか10%を取得しながら、サービス1は、全システムメモリの17%を取得する必要があります。これは、インスタンスサイズの変更に容易に対応するためです。

私ansible /役割/ ecs_cluster_init/VARS/main.yamlファイルでIは、(部分的部分)を有する:

ecs_task_definitions: 
    - name: "service1" 
    elb: "{{ elb_creation_output.results[0].elb.dns_name }}" 
    image: "{{ service1_docker_image }}" 
    port: "{{ ports.service1 }}" 
    memory: "{{ (total_system_memory * (docker_memory_limit_service1|int/100))|int|abs }}" 

明瞭性を確保するために、サービス・メモリ値を100で割ることによって(割合になっています)、システム全体のメモリの一部を決定します。私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 }}" 

私は、私は次のエラーを受け取る役割のために脚本を実行します。

TASK [ecs_cluster_create : Create ECS Service1 Task Definitions] **************** 
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: Invalid type for parameter containerDefinitions[0].memory, value: 204, type: <type 'str'>, valid types: <type 'int'>, <type 'long'> 

どれでも私が間違ってやっているアイデアか、メモリの値を指定していないところがintであるべきですか?

+0

'{{item.memory | int | to_json}}' 'to_json'フィルタを追加しようとすることができます – Vor

+0

提案を適用した後も同じエラーメッセージが表示されます。 –

答えて

1

Anagers/Jinjaの既知の問題は、テンプレート化後にintタイプを保存できないことです。
つまり、|intは二重括弧内の整数ですが、中括弧を閉じると文字列になります。

しかしAnsibleは、テンプレートの後dicts /リストのような複雑な型を保持しますので、あなたはこのトリックを行うことがあります。

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

私は例を短縮しました。

このようにして、私たちは、テンプレート作成後に変換可能なJSONリストの文字列を作成します。

+0

to_jsonフィルタの後の '+'は何をしますか? –

+1

'dict(...)| to_json'はJSON文字列を返します。コンテナは(あなたの例によると)リストでなければならないので、' + '文字列連結で' ['と'] 'を両側に追加します。 –

+0

コンテナリストにもリストが含まれていると、コンテナリストをどのようにフォーマットしますか?元の質問を更新して、私が参照しているentryPointリストを表示しました。 –

関連する問題