ansible - 递增变量值时出现 Unicode 错误

标签 ansible ansible-facts

当我使用静态变量时,它工作得非常好。但是当我尝试使用动态时它不起作用。

剧本:

---
- hosts: Swi1
  vars: 
    NewOne: 0
    provider:
      host: "192.168.0.30"
      transport: "cli"
      username: "cisco"
      password: "cisco"
    
  tasks:
    - name: gather facts
      register: iosfacts
      ios_facts:
        provider: "{{ provider }}"
        
    - name: Display the value of the counter
      debug:
        msg: "NewOne={{ NewOne }} / Data type={{ NewOne | type_debug }}"  
        
    - name: interface description
      set_fact: 
        NewOne: " {{ NewOne + 1 }}"
        parents: "interface {{ item.key }}"
      with_dict: "{{ iosfacts.ansible_facts.ansible_net_interfaces }}"
      when: item.value.operstatus == "up"
      
    - debug:
        msg: " This is Debug {{ NewOne }}"

给出错误:

fatal: [Swi1]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ NewOne + 1 }}): coercing to Unicode: need string or buffer, int found"}

最佳答案

如果您想对变量进行增量操作,则需要将其重新转换为 int,因为 set_fact 总是会得到一个字符串。

例如,两个任务:

- set_fact:
    NewOne: "{{ NewOne | d(0) + 1 }}"

- debug:
    var: NewOne | type_debug

正在给予

TASK [set_fact] ***************************************************************
ok: [localhost]

TASK [debug] ******************************************************************
ok: [localhost] => 
  NewOne | type_debug: str

解决办法是使用 int 过滤器。

给定:

- set_fact:
    NewOne: "{{ NewOne | d(0) | int + 1 }}"
  loop: "{{ range(1, 4) }}"

- debug:
    var: NewOne

这会产生预期的结果

TASK [set_fact] ***************************************************************
ok: [localhost] => (item=1)
ok: [localhost] => (item=2)
ok: [localhost] => (item=3)

TASK [debug] ******************************************************************
ok: [localhost] => 
  NewOne: '3'

但是根据您的用例,有更详细和更简短的方法来实现相同的目的:

- set_fact:
    NewOne: >-
      {{ 
        iosfacts
          .ansible_facts
          .ansible_net_interfaces 
        | selectattr('value.operstatus', '==', 'up')
        | length
      }}

给定:

- debug:
    msg: >-
      {{
        iosfacts
          .ansible_facts
          .ansible_net_interfaces
        | selectattr('value.operstatus', '==', 'up')
        | length
      }}
  vars:
    iosfacts:
      ansible_facts:
        ansible_net_interfaces:
          - value:
              operstatus: up
          - value:
              operstatus: down
          - value:
              operstatus: up

这会产生:

ok: [localhost] => 
  msg: '2'

关于ansible - 递增变量值时出现 Unicode 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72942530/

相关文章:

ansible - 发现管理 IP 并在模板中使用它

python - 在模块代码中使用 ansible_facts

ssh - 查找 ansible ssh 用户

Ansible主机文件如何在ansible_ssh_pass中提供#

Ansible 循环打印调试中来自 stdout 的注册变量

arrays - 如何将命令输出存储到 Ansible 中的数组中?

安塞 bool /金贾 : Conditional port publishing in Docker/Podman

logging - Ansible 控制台输出和日志级别

regex - Ansible regex_search 标准输出不工作,但在 regex101.com 中工作

Ansible:合并已多次使用的项目变量