2016-11-29 104 views
1

我有一個IP地址字符串中提取前三octects:192.168.10.2Ansible:從IP地址

我想提取IP在Ansible的前三個字節,我試圖用這個表達式。

{{comp_ip | regex_replace("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"), "//1"}} 

這不會產生任何結果。有人能糾正我出錯的地方嗎?

+0

你想'192.168.10'退換? – helloV

+0

是的,那是正確的。 – spamulap12

回答

6

如果已經有了點分隔的IP地址,有是一種簡單的方法:

{{ comp_ip.split('.')[0:3] | join('.') }} 
+0

這是一個很酷的伎倆,很明顯。所以一般來說,我們可以通過管道使用任何python方法嗎? – spamulap12

+0

不,管道用於過濾器,請參閱我的[其他](http://stackoverflow.com/a/39794185/2795592)答案以瞭解詳細信息。但是你可以用點符號來使用python的字符串和字符串方法。 –

2

你做得對,你只需要在正則表達式中使用括號來創建一個組。最好匹配整個ip並結束您的正則表達式與$,並且在您的代碼中將//1更改爲\\1

變化正則表達式來自:

^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 

爲了這個表達式:

^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.[0-9]{1,3}$ 

這是全碼:

{{comp_ip | regex_replace('^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\.[0-9]{1,3}$', '\\1')}} 
+0

謝謝,但它有一些問題與我膽汁的語法。 違規行似乎是: set_fact: net:{{comp_ip | regex_replace('^([0-9] {1,3}。[0-9] {1,3}。[0-9] {1,3})'),'\\ 1'}} ^這裏 – spamulap12

+0

@ spamulap12嘗試更新的代碼。 – Ibrahim

+0

沒有語法錯誤,但o/p沒有任何內容 {「net」:「(u'','\\\\ 1')」} – spamulap12

0

在要計算網絡地址,您可以使用Ansible IPADDR過濾這正好提供了這種功能的情況下: http://docs.ansible.com/ansible/latest/playbooks_filters_ipaddr.html

--- 
- hosts: localhost 
    vars: 
    my_ip: "{{ ansible_default_ipv4.network }}/{{ ansible_default_ipv4.netmask }}" 
    tasks: 
    - debug: msg="network {{ my_ip | ipaddr('network') }}" 
    - debug: msg="netmask {{ my_ip | ipaddr('netmask') }}"