这个问题关于Ansible中的循环,而不是AWS中的循环,但为了清晰起见,我将使用AWS部署问题作为示例。如何用正则表达式替换Ansible中的嵌套值
对于我们的部署脚本,我试图循环Amazon EC2容器服务中的一些集群。我最终要做的是重新启动集群上的每个服务。鉴于其名称,我可以重新启动服务。不过,我需要简单的名称,而不是完全合格的ARN。所以,我仰望服务每个集群,并得到这样的:
results:
- _ansible_item_result: true
_ansible_no_log: false
_ansible_parsed: true
ansible_facts:
services:
- arn:aws:ecs:eu-central-1:55:service/test-services
changed: false
failed: false
invocation:
module_args:
aws_access_key: null
aws_secret_key: null
cluster: services
details: false
ec2_url: null
profile: null
region: null
security_token: null
service: null
validate_certs: true
item: services
- _ansible_item_result: true
_ansible_no_log: false
_ansible_parsed: true
ansible_facts:
services:
- arn:aws:ecs:eu-central-1:55:service/test-service
- arn:aws:ecs:eu-central-1:55:service/frontend
- arn:aws:ecs:eu-central-1:55:service/beats
changed: false
failed: false
invocation:
module_args:
aws_access_key: null
aws_secret_key: null
cluster: test-service
details: false
ec2_url: null
profile: null
region: null
security_token: null
service: null
validate_certs: true
item: test-service module_args:
aws_access_key: null
aws_secret_key: null
cluster: test-service
details: false
ec2_url: null
profile: null
region: null
security_token: null
service: null
validate_certs: true
项目:测试服务
现在我想通过该服务的短名称来代替每个ARN。例如:arn:aws:ecs:eu-central-1:55:service/test-service
变成test-service
。
更换后,我可以做环比服务,并通过设置所需的次数为0,将其关闭(以后我就会把他们重新开启):
- name: "Turn services off"
ecs_service:
name: "{{ item[1]}}"
desired_count: 0
task_definition: "{{ taskdefinitions[item[1]] }}"
cluster: "{{ item[0].item }}"
state: present
with_subelements:
- "{{ result.results }}"
- ansible_facts.services
register: turnOffServiceResult
凡taskdefinitions
是一个简单的字典我在剧本中定义:
taskdefinitions:
services:
- test-services
test-xde-worker-service:
- test-service
所以后,我得到如上图所示为一个变量result
我尝试用正则表达式替换做以下的AWS列表:
- set_fact:
result:
results:
ansible_facts:
services: "{{ result.results.1.ansible_facts.services | map('regex_replace', '.*/(.*?)$', '\\1') | list }}"
这工作正常,但它显然只取代了一个集群的服务名称,并且我丢失了字典ansible_facts
中的任何其他字段。后者是可以接受的,前者不可以。所以这里是一个问题:我如何替换嵌套列表中的文本?另一个问题是跳过关闭taskdefinitions
中未包含的服务,但这不在眼前。
为什么传递给'ecs_service'时更换整个字典里面的价值观和不呢? –
好点,我试着在传递变量时使用过滤器,但这似乎并不奏效。您会注意到我使用'item [1]'作为命名索引来查找task_definition。如果你能告诉我如何在那里应用过滤器,我会非常高兴,我无法让它工作。我也很确定某人在某个时候需要过滤嵌套列表中的一些值。因此更普遍的问题。 – titusn