我有一个启动 n EC2实例的剧本。启动时,它会使用Env: {{ env }}
和ManagedBy: Ansible
标记它们,但我也想添加一个具有某种相似含义的名称。对我而言,这通常采用<env>-<purpose><number>
格式(例如dev-web02
或prd-db01
)。
如果可能的话,我真的很喜欢Ansible为我做这件事。
我目前已构建了我的Playbook,以便使用{{ exact_count }}
模块验证ec2
个实例是否存在。然后使用ec2_tag
模块为创建的实例指定名称标记:
- name: Instances | Tag each new instance with a name
ec2_tag:
aws_access_key: "{{ awscli.access_key }}"
aws_secret_key: "{{ awscli.secret_key }}"
region: "{{ aws.region }}"
resource: "{{ item.1.id }}"
state: present
tags:
Name: "{{ env_short }}-{{ 'ws%02d' | format(item.0) }}"
with_indexed_items: webservers.instances
这很有效,这是它第一次运行。问题是它不会遍历我的所有实例,而是仅在可能已经在这个运行的剧本期间创建的那些实例中进行迭代。
是否有更好的方法来执行此操作,以便新实例能够检测到序列并继续执行,以便在第二次运行时,例如,在我将{{ exact_count }}
从1更改为2之后,第二次运行创建的服务器的Name
值为dev-ws02
?
这对Ansible来说可能有很多问题,可能有一个很好的理由我找不到答案,但有时候你会感到惊喜,所以我想我会问。
答案 0 :(得分:2)
根据经验,我发现使用tagged_instances
属性似乎有效。此值似乎包含与标记匹配的每个服务器,而不仅仅是仅创建的任何服务器。目前,我不记得ec2_tag
模块是否只是不会覆盖已经存在的标签或现有标签是否更新,但最终的结果似乎是按照我喜欢的方式运行锻炼。
这是我更新的任务:
- name: Instances | Tag each new instance with a name
ec2_tag:
aws_access_key: "{{ awscli.access_key }}"
aws_secret_key: "{{ awscli.secret_key }}"
region: "{{ aws.region }}"
resource: "{{ item.1.id }}"
state: present
tags:
# e.g. dev-web03, prd-anz01
Name: "{{ env_short }}-{{ server_type_abbrev }}{{ '%02d' | format(item.0) }}"
with_indexed_items: ec2.tagged_instances