Вероятная проблема с цитированием при использовании аргумента stdin модуля оболочки ansible - PullRequest
0 голосов
/ 01 мая 2018

У меня есть книга со следующими заданиями:

- set_fact:
    asg_filter: >
      .AutoScalingGroups[] |
      select(.Tags[] | select(.Key == "Role").Value == "myrole")
- shell: aws autoscaling --region us-west-2 describe-auto-scaling-groups | jq --compact-output "{{ asg_filter }}"
  register: asgs_result
- set_fact:
    stale_instance_filter: >
      .LaunchConfigurationName as $lc |
      .Instances[] |
      select(.LaunchConfigurationName != $lc) |
      .InstanceId

Теперь я хочу использовать stale_instance_filter на asgs_result.stdout. Следующие работы:

- shell: echo '{{ asgs_result.stdout }}' | jq -r '{{ stale_instance_filter }}'

Но это не так:

- shell: jq -r '{{ stale_instance_filter }}'
  args:
    stdin: "{{ asgs_result.stdout }}"

Я получаю следующее сообщение об ошибке: parse error: Invalid numeric literal at line 1, column 23 (которое, я считаю, связано с номером счета в ARN для ASG.) Я думаю, что это проблема с цитированием (может быть, что-то с двойными кавычками в JSON), но я Также пробовал asgs_result.stdout | quote безрезультатно. Я также попробовал модуль command; это тоже не помогло. Конечно, все это работает, если я делаю это непосредственно в CLI.

Я понимаю, что могу объединить два jq фильтра, но я хочу повторно использовать asgs_result для других целей и не хочу повторять запрос несколько раз. Как я могу это исправить, чтобы я мог использовать аргумент stdin?

Редактировать: меня попросили привести пример значения asgs_result, ну вот, пожалуйста, вот атрибут stdout (так как я больше ничего не использую):

"stdout": "{\"AutoScalingGroupARN\":\"arn:aws:autoscaling:us-east-2:123456:autoScalingGroup:e75a213b-75fe-467c-8cf5-d7c51f76c471:autoScalingGroupName/myrole-dev\",\"TargetGroupARNs\":[],\"SuspendedProcesses\":[],\"DesiredCapacity\":4,\"Tags\":[{\"ResourceType\":\"auto-scaling-group\",\"ResourceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"dev\",\"Key\":\"Dimension\"},{\"ResourceType\":\"auto-scaling-group\",\"ResouJceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"true\",\"Key\":\"Monitored\"},{\"ResourceType\":\"auto-scaling-group\",\"ResourceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"myrole\",\"Key\":\"Name\"},{\"ResourceType\":\"auto-scaling-group\",\"ResourceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"myrole\",\"Key\":\"Role\"},{\"ResourceType\":\"auto-scaling-group\",\"ResourceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"2035-09-30 18:55:31 +0000\",\"Key\":\"cleaner-destroy-after\"},{\"ResourceType\":\"auto-scaling-group\",\"ResourceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"vpce-2c23ca45\",\"Key\":\"force_s3_endpoint_dependency\"},{\"ResourceType\":\"auto-scaling-group\",\"ResourceId\":\"myrole-dev\",\"PropagateAtLaunch\":true,\"Value\":\"owned\",\"Key\":\"kubernetes.io/cluster/dev\"}],\"EnabledMetrics\":[],\"LoadBalancerNames\":[],\"AutoScalingGroupName\":\"myrole-dev\",\"DefaultCooldown\":300,\"MinSize\":4,\"Instances\":[{\"ProtectedFromScaleIn\":false,\"AvailabilityZone\":\"us-east-2b\",\"InstanceId\":\"i-0141fd35e3cf3ad0a\",\"HealthStatus\":\"Healthy\",\"LifecycleState\":\"InService\",\"LaunchConfigurationName\":\"dev_myrole_20180511171410107500000002\"},{\"ProtectedFromScaleIn\":false,\"AvailabilityZone\":\"us-east-2c\",\"InstanceId\":\"i-01aec2b3546d75190\",\"HealthStatus\":\"Healthy\",\"LifecycleState\":\"InService\",\"LaunchConfigurationName\":\"dev_myrole_20180511171410107500000002\"},{\"ProtectedFromScaleIn\":false,\"AvailabilityZone\":\"us-east-2a\",\"InstanceId\":\"i-0830b227f034d2859\",\"HealthStatus\":\"Healthy\",\"LifecycleState\":\"InService\",\"LaunchConfigurationName\":\"dev_myrole_20180511171410107500000002\"},{\"ProtectedFromScaleIn\":false,\"AvailabilityZone\":\"us-east-2b\",\"InstanceId\":\"i-0f7d847e8c168040b\",\"HealthStatus\":\"Healthy\",\"LifecycleState\":\"InService\",\"LaunchConfigurationName\":\"dev_myrole_20180511171410107500000002\"}],\"MaxSize\":4,\"VPCZoneIdentifier\":\"subnet-c348988e,subnet-79743210,subnet-156ee36e\",\"HealthCheckGracePeriod\":300,\"TerminationPolicies\":[\"Default\"],\"LaunchConfigurationName\":\"dev_myrole_20180511171410107500000002\",\"CreatedTime\":\"2018-02-20T22:35:32.183Z\",\"AvailabilityZones\":[\"us-east-2a\",\"us-east-2b\",\"us-east-2c\"],\"HealthCheckType\":\"EC2\",\"NewInstancesProtectedFromScaleIn\":false}"

Извините, что все в одной строке, но я не хочу, чтобы кто-то думал, что там есть новая строка, потому что ее нет.

1 Ответ

0 голосов
/ 15 мая 2018

Содержимое JSON, по-видимому, интерпретируется перед отправкой на стандартный ввод, поэтому похоже, что отправляются простые кавычки (в режиме подробного просмотра с -vvv):

"stdin": "{'AutoScalingGroupARN': 'arn:aws:autoscaling:us-east-2:123456:autoScalin
gGroup:e75a213b-75fe-467c-8cf5-d7c51f76c471:autoScalingGroupName/myrole-dev', ...,
 'AvailabilityZones': ['us-east-2a', 'us-east-2b', 'us-east-2c']}"

Что не является действительным JSON:

$ echo "{'AutoScalingGroupARN': 'arn:aws:autoscaling:us-east-2:123456:autoScalingGroup:e75a213b-75fe-467c-8cf5-d7c51f76c471:autoScalingGroupName/myrole-dev', 'HealthCheckGracePeriod': 300}" | jq
parse error: Invalid numeric literal at line 1, column 23

$ echo '{"AutoScalingGroupARN": "arn:aws:autoscaling:us-east-2:123456:autoScalingGroup:e75a213b-75fe-467c-8cf5-d7c51f76c471:autoScalingGroupName/myrole-dev", "HealthCheckGracePeriod": 300}' | jq
{
  "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-2:123456:autoScalingGroup:e75a213b-75fe-467c-8cf5-d7c51f76c471:autoScalingGroupName/myrole-dev",
  "HealthCheckGracePeriod": 300
}

Итак, вам нужно «сбежать» от него. К сожалению, фильтр to_json, спасение для многих:

"stdin": "\"{\\\"AutoScalingGroupARN\\\":\\\"arn:aws:autosca...

Но фильтр string идеально подходит:

"stdin": "{\"AutoScalingGroupARN\":\"arn:aws:autosca...

Итак, правильный путь с stdin таков: :

- shell: jq -r '{{ stale_instance_filter }}'
  args:
    stdin: "{{ asgs_result.stdout | string }}"
...