Kha*_*han 5 bash shell loops ansible ansible-playbook
我有3个变量名为IPOctet,ServerIPRange和epcrange.如果我在终端中执行以下操作,它可以完美地工作
IPOctet=$(echo "$ServerIPRange/$epcrange+$IPOctet" | bc)
Run Code Online (Sandbox Code Playgroud)
如何在任务中的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
Run Code Online (Sandbox Code Playgroud)
这个命令的正确语法是什么?也许使用shell echo".......".我只需要将此命令的内容保存到IPOctet变量中,IPOctet将随每次循环迭代而改变,结果应存储在我的结果寄存器中
PS:我如何单独访问阵列中的各个项目?
编辑:这样的事情是否可能,目前它只进行一次计算并将其存储在寄存器中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
Run Code Online (Sandbox Code Playgroud)
小智 3
您的终端表达式会重新分配 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
Run Code Online (Sandbox Code Playgroud)语法:"shell {{IPOctet}}=$(echo ..."不分配给 Ansible 变量。shell 尝试执行类似 的命令"10=138",但未找到该命令。
当在循环中使用 register 时,目标变量在循环完成之前不会设置 - 因此您的表达式始终会看到 的原始值{{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
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是expr命令而不是命令bc,但结果是相同的。
您可以使用 result.stdout_lines 迭代这些结果:
- name: iterate results
local_action: debug msg={{item}}
with_items: result.stdout_lines
Run Code Online (Sandbox Code Playgroud)