我在取消注册 LB 实例的步骤中的 playbook 中出现错误,它执行了该过程,但 playbook 失败了。
FAILED! => {"msg": "The conditional check '(target_facts.instance_target_groups | map(attribute='targets') | flatten | map(attribute='target_health') | rejectattr('state', 'equalto', 'unhealthy') | list | length) == 0' failed. The error was: no test named 'equalto'"}
file: lb_deregister.yaml
---
- name: de-register EC2 "{{ service_instance_id }}"
elb_target:
target_group_name: "{{ service_target_group_name }}"
target_id: "{{ instance_document.json.instanceId }}"
region: "{{ instance_document.json.region }}"
target_port: "{{ target_group_fact.instance_target_groups[0].targets[0].target_port | default(service_target_port, true) }}"
state: absent
register: instancederegister
until: instancederegister is not failed
retries: 60
delay: 10
- name: Waiting status unhealthy "{{ instance_document.json.instanceId }}"
elb_target_facts:
get_unused_target_groups: false
region: "{{ instance_document.json.region }}"
instance_id: "{{ instance_document.json.instanceId }}"
register: target_facts
until: (target_facts.instance_target_groups |
map(attribute='targets') |
flatten |
map(attribute='target_health') |
rejectattr('state', 'equalto', 'unhealthy') |
list |
length) == 0
retries: 100
delay: 20
file: install.yaml
- name: getting elb facts
elb_target_facts:
get_unused_target_groups: false
region: "{{ instance_document.json.region }}"
instance_id: "{{ instance_document.json.instanceId }}"
register: target_group_fact
when:
- service_deploy_with_loadbalancer
- service_target_group_name is defined
tags:
- molecule-notest
retries: 100
delay: 5
until: target_group_fact is not failed
- include: lb_deregister.yml
when:
- service_deploy_with_loadbalancer
- service_target_group_name is defined
tags:
- molecule-notest
retries: 100
delay: 5
我已经使用了 Ansible Doc,我被困在这部分,再次运行 playbook 它通过了该步骤,因为机器离开了 ELB,但是第一次总是失败。
即使错误消息带有
The error was: no test named 'equalto'
很清楚,还有其他类似的问答可用,似乎没有那么清楚的记录,很容易发现语法中的Jinja2内置过滤器
rejectattr()
rejectattr(key, test, value)
“通过对每个对象的指定属性应用内置测试来过滤对象序列,并拒绝测试成功的对象。”
eq
。
因此,正如已经评论过的
rejectattr('state', 'eq', 'unhealthy')
或 rejectattr('state', '==', 'unhealthy')
(如果使用别名)。别名 equalto
是在 Jinja2 v2.8 中引入的。
对于从开箱即用的分发存储库安装了 Ansible 2.9.x 的 RHEL/CentOS 7.9.x,将会有
~$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
~$
ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/usr/share/ansible/modules', u'/home/ansible_user/vendor/inventory_collections/ansible_collections']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 6 2023, 09:53:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
~$
~$ rpm -qa | grep -i jinja
python-jinja2-2.7.2-4.el7.noarch
如果使用测试别名
equalto
,则会导致错误。
在这样的系统上,还可以通过 PyPi (
pip
) 而不是分发存储库来更新或安装 Ansible,例如
~$ ansible --version
ansible [core 2.11.12]
config file = None
configured module search path = [u'/home/ansible_user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /home/ansible_user/.local/lib/python2.7/site-packages/ansible
ansible collection location = /home/ansible_user/.ansible/collections:/usr/share/ansible/collections
executable location = /home/ansible_user/.local/bin/ansible
python version = 2.7.5 (default, Oct 6 2023, 09:53:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
jinja version = 2.11.3
libyaml = True
~$
~$ pip list
Package Version
--------------------------------- -----------
ansible 4.10.0
ansible-core 2.11.12
ansible-lint 4.2.0
...
Jinja2 2.11.3
...
并且不会遇到这样的问题。