gdix0n
gdix0n

Reputation: 274

Extract and split string in ansible

I have a machine where the variable contains the a number that I want to extract and then split to build an IP address using ansible.

variable = machine240dev

I want to be able to extract 240 then split it to fill in the two middle octets of an ip address

e.g. 10.2.40.170

I have tried various ways such as:

var: machine240dev

10.{{  var | regex_replace('[^0-9]','')[0] }}.{{ var | regex_replace('[^0-9]','')[-2:] }}.170

which fails as it doesn't like the [0] after the regex_replace filter.

I was just wondering if anyone has done this before or know a clean way to do it.

EDIT:

I have set a fact to first set the variable for the vlan before extracting the specific parts of the string.

- name: Setting vlan fact
  set_fact: vlan="{{  var | regex_replace('[^0-9]','') }}"

Then in my template i set:

IPADDR=10.{{ vlan[0] }}.{{ vlan[-2:] }}.170

However I am still open to suggestions on how this could be improved

Upvotes: 4

Views: 2062

Answers (2)

Vladimir Botka
Vladimir Botka

Reputation: 68344

Ansible allows you to create intermediate variables with the scope of the task, e.g.

    - set_fact:
        IPADDR: "10.{{ vlan[0] }}.{{ vlan[-2:] }}.170"
      vars:
        vlan: "{{ var | regex_replace('[^0-9]','') }}"

Upvotes: 2

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627488

You can use a regex_replace solution like:

10.{{  var | regex_replace('.*([0-9])([0-9]{2}).*', '\\1.\\2') }}.170

Here,

  • .* - matches any zero or more chars other than line break chars, as many as possible
  • ([0-9])([0-9]{2}) - Captures a digit into Group 1 and then two digits into Group 2
  • .* - matches any zero or more chars other than line break chars, as many as possible

The \1.\2 replacement replaces the matched string with Group 1 + . + Group 2 values.

See this regex demo.

Or, a regex_search based solution:

10.{{  var | regex_search('[0-9]') }}.{{ var | regex_search('(?<=[0-9])[0-9]{2}') }}.170

Output:

10.2.40.170

Here,

  • regex_search('[0-9]') extracts the first digit
  • regex_search('(?<=[0-9])[0-9]{2}') - extracts two digits after a digit.

Upvotes: 1

Related Questions