我有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将随每次循环迭代而改变,结果应存储在我的结果寄存器中
P.S:我如何单独访问阵列中的各个项目?
编辑:这样的事情是否可能,目前它只进行一次计算并将其存储在寄存器中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
2 回答
语法:
"shell {{IPOctet}}=$(echo ..."
未分配给Ansible变量 . shell尝试执行找不到的"10=138"
之类的命令 .在循环中使用寄存器时,在循环完成之前不会设置目标变量 - 因此表达式始终会看到
{{IPOctet}}
的原始值 .解决方案是将整个循环作为单个shell命令运行:
NOTE: 我使用了
expr
命令而不是bc
,但结果是一样的 .首先你的Jinja模板不正确,每个变量都需要用一对括号包围 . 您不能在单对括号中使用多个变量 . 例如,
其次,set_fact仅用于设置事实值 . 您无法使用set_fact运行shell命令 . 你应该使用shell模块 .
Ansible将进行4次计算,并将其作为4个不同的元素存储在列表中 . 您可以检查列表中的所有内容,甚至可以通过循环访问它 .
希望这可以帮助 :)