我正在使用--extra-vars "lan=10.10.10.1"
我现在需要增加这个ip地址,以便最后一个八位字节是.2所以它等于10.10.10.2。
如何在ansible中实现这一目标?
答案 0 :(得分:2)
在一行中:
- set_fact: new_ip="{{ lan | regex_replace('(^.*\.).*$', '\\1') }}{{lan.split('.')[3] | int + 1 }}"
它是如何运作的?
tasks:
- name: Echo the passed IP
debug: var={{lan}}
- name: Extract the last octet, increment it and store it
set_fact: octet={{lan.split('.')[3] | int + 1 }}
- debug: var=octet
- name: Append the incremented octet to the first 3 octets
set_fact: new_ip="{{ lan | regex_replace('(^.*\.).*$', '\\1') }}{{octet}}"
- debug: var=new_ip
输出
TASK: [Echo the passed IP] ****************************************************
ok: [127.0.0.1] => {
"127.0.0.1": "{{ 127.0.0.1 }}"
}
TASK: [Extract the last octet, increment it and store it] *********************
ok: [127.0.0.1] => {"ansible_facts": {"octet": "2"}}
TASK: [debug var=octet] *******************************************************
ok: [127.0.0.1] => {
"octet": "2"
}
TASK: [Append the incremented octet to the first 3 octets] ********************
ok: [127.0.0.1] => {"ansible_facts": {"new_ip": "127.0.0.2"}}
TASK: [debug var=new_ip] ******************************************************
ok: [127.0.0.1] => {
"new_ip": "127.0.0.2"
}
答案 1 :(得分:2)
从Ansible 2.7开始,可以使用IP Math:
Field<String> f = DSL.field(
"group_concat(distinct {0}, ', ')",
SQLDataType.VARCHAR,
MY_COLUMN
);
答案 2 :(得分:1)
您可能需要查看ipaddr filter
答案 3 :(得分:1)
{{ ((lan | ipaddr('int')) + 1) | ipaddr }}
小心Jinja2的运算符优先级,它非常时髦。
答案 4 :(得分:0)
如果您想通过子网执行此操作,这会很有帮助。
- name: Give IP addresses sequentially from a subnet
debug:
msg: "{{ '10.10.1.48/28' | next_nth_usable(loop_index) }}"
loop: "{{ list }}"
loop_control:
index_var: loop_index
请不要忘记在通过以下方式运行剧本之前安装“netaddr”Python 库:
pip install netaddr
最后,请记住index_var从0开始,所以如果你想从第一个IP地址开始,切换msg 行:
msg: "{{ '10.10.1.48/28' | next_nth_usable(loop_index |int + 1) }}"