Ansible、Boto、AWS - 参数 containerDefinitions[0].memory 的类型无效
Ansible, Boto, AWS - Invalid type for parameter containerDefinitions[0].memory
我在 Amazon ECS 上的 docker 容器中有多个服务 运行,我正在为每个服务分配总系统内存的百分比。
在我的 ansible/roles/ecs_cluster_init/defaults/main.yaml 文件中,我有以下条目:
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
服务 1 应获得系统总内存的 17%,而服务 4 仅获得 10%。这是为了轻松适应实例大小的变化。
在我的 ansible/roles/ecs_cluster_init/vars/main.yaml 文件中(部分):
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/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 }}"
当我 运行 角色的剧本时,我收到以下错误:
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 的地方吗?
Ansible/Jinja 的一个已知问题是您无法在模板化后保留 int
类型。
换句话说 |int
是双括号内的整数,但是当你关闭括号时变成字符串。
但是 Ansible 在模板化后保留了像 dicts/list 这样的复杂类型,所以你可以这样做:
- 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-列表,在模板化后 ansible 转换。
我在 Amazon ECS 上的 docker 容器中有多个服务 运行,我正在为每个服务分配总系统内存的百分比。
在我的 ansible/roles/ecs_cluster_init/defaults/main.yaml 文件中,我有以下条目:
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
服务 1 应获得系统总内存的 17%,而服务 4 仅获得 10%。这是为了轻松适应实例大小的变化。
在我的 ansible/roles/ecs_cluster_init/vars/main.yaml 文件中(部分):
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/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 }}"
当我 运行 角色的剧本时,我收到以下错误:
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 的地方吗?
Ansible/Jinja 的一个已知问题是您无法在模板化后保留 int
类型。
换句话说 |int
是双括号内的整数,但是当你关闭括号时变成字符串。
但是 Ansible 在模板化后保留了像 dicts/list 这样的复杂类型,所以你可以这样做:
- 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-列表,在模板化后 ansible 转换。