我有3个名为IPOctet,ServerIPRange和epcrange的变量。
如果我在终端中执行以下操作,则可以正常运行

IPOctet=$(echo "$ServerIPRange/$epcrange+$IPOctet" | bc)

我如何在任务中的ansible中执行类似的操作,例如
---
- hosts: localhost
  gather_facts: False

  vars_prompt:
    - name: epcrange
      prompt: Enter the number of EPCs that you want to configure
      private: False
      default: "1"
    - name: serverrange
      prompt: Enter the number of Clients that you want to configure
      private: False
      default: "1"
    - name: ServerIPRange
      prompt: Enter the ServerIP range
      private: False
      default: '128'
    - name: LastIPOctet
      prompt: Enter The last Octet of the IP you just entered
      private: False
      default: '10'

  pre_tasks:


    - name: Set some facts
      set_fact:
        ServerIP1: "{{ServerIP}}"
        ServerIPRange1: "{{ServerIPRange}}"
        IPOctet: "{{LastIPOctet}}"

    - name: local action math
      local_action: shell {{IPOctet}}=$(echo "${{ServerIPRange}}/${{epcrange}}+${{IPOctet}}" | bc)  # Proper Syntax?
      with_sequence: start=1 end=4
      register: result
      ignore_errors: yes

此命令的正确语法是什么?也许使用shell echo“.......”。我只需要将此命令的内容保存到IPOctet变量中,并且每次循环迭代时IPOctet都会发生变化,并且结果应存储在我的结果寄存器中

附注:如何才能分别访问数组中的各个项目?

编辑:是这样的可能,当前它只计算一次,并将其存储在寄存器中4次...
- name: bashless math
  set_fact:
    IPOctet: "{{ (ServerIPRange|int/epcrange|int)+IPOctet|int }}"
  register: IPOctet
  with_sequence: "start=1 end={{stop}} "
  register: my_ip_octet

最佳答案

  • 您的终端表达式重新分配了IPOctet shell变量,因此每次执行时都会给出不同的结果。很好,但是很难在Ansible中重现:
    $ IPOctet=10 ServerIPRange=128 epcrange=1
    $ IPOctet=$(echo "$ServerIPRange/$epcrange+$IPOctet" | bc); echo $IPOctet
    138
    
    $ IPOctet=$(echo "$ServerIPRange/$epcrange+$IPOctet" | bc); echo $IPOctet
    266
    
  • 语法:"shell {{IPOctet}}=$(echo ..."不会分配给Ansible变量。
    Shell尝试执行未找到的命令,例如"10=138"
  • 在循环中使用寄存器时,直到循环完成才设置目标变量-因此您的表达式始终会看到{{IPOctet}}的原始值。
  • 一种解决方案是将整个循环作为单个shell命令运行:
    - name: local action math2
      local_action: shell IPOctet={{IPOctet}}; for i in 1 2 3 4; do IPOctet=$(expr {{ServerIPRange}} / {{epcrange}} + $IPOctet); echo $IPOctet; done
      register: result
    

    注意:我使用了expr命令而不是bc,但是结果是相同的。
  • 您可以使用result.stdout_lines遍历这些结果:
    - name: iterate results
      local_action: debug msg={{item}}
      with_items: result.stdout_lines
    
  • 10-01 13:20