LB 取消注册中的 Ansible 过滤器 `rejectattr`:错误是:没有名为“eq”或“==”的测试[重复]

问题描述 投票:0回答:1

我在取消注册 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,但是第一次总是失败。

ansible
1个回答
0
投票

即使错误消息带有

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
...

并且不会遇到这样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.