Philippe MESMEUR
Philippe MESMEUR

Reputation: 889

Ansible: how to change/replace a port number in a configuration file

I am a newbie in the ansible world and one of the first thing I want to do is to change the default port in a configuration file: /etc/xrdp/xrdp.ini

Every time where value 3389 is found, I would like to replace it by a new value given by the variable xrdp_port

vars:
  xrdp_port: 3391

I thought that something like the following declaration would work but unfortunately it doesn't

    - name: tune /etc/xrdp/xrdp.ini
      replace:
        path: "/etc/xrdp/xrdp.ini"
        regexp: '(.*)3389(.*)'
        replace: '\1{{ xrdp_port }}\2'

I would strongly appreciate any help Thank you

Upvotes: 0

Views: 1058

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 67984

Q: "Where value 3389 is found replace it with a new value given by the variable xrdp_port."

A: Given the file xrdp.ini for testing

shell> cat xrdp.ini
port=3389

the task below does the job

    - replace:
        path: xrdp.ini
        regexp: '^(\s*)port(\s*)=(\s*)3389(\s*?)$'
        replace: '\1port={{ xrdp_port }}'
      vars:
        xrdp_port: 3391

Running the play with options --check --diff will display the difference

TASK [replace] ********************************************************
--- before: xrdp.ini
+++ after: xrdp.ini
@@ -1 +1 @@
-port=3389
+port=3391

changed: [localhost]

When the port is not set to default

shell> cat xrdp.ini
port=3999

the task will do nothing

TASK [replace] *****************************************************
ok: [localhost]

But, the limitation of replacing '3389' only doesn't make sense. '3389' is the default. No 'port' configuration or 'port=3389' is the same. It would make sense to add 'port={{ xrdp_port }}' always, e.g.

    - replace:
        path: xrdp.ini
        regexp: '^(\s*)port(\s*)=(.*?)$'
        replace: '\1port={{ xrdp_port }}'
      vars:
        xrdp_port: 3391

will replace any port's value by the value of xrdp_port

TASK [replace] *****************************************************
--- before: xrdp.ini
+++ after: xrdp.ini
@@ -1 +1 @@
-port=3999
+port=3391

changed: [localhost]

But, the line won't be added if the 'port' option is missing, e.g.

shell> cat xrdp.ini
security_layer=tls

the task will do nothing

TASK [replace] *****************************************************
ok: [localhost]

It would be better to use the module lineinfile instead of replace, e.g.

    - lineinfile:
        path: xrdp.ini
        regexp: '^(\s*)port(\s*)=(.*)$'
        line: 'port={{ xrdp_port }}'
      vars:
        xrdp_port: 3391

will add the line

TASK [lineinfile] **************************************************
--- before: xrdp.ini (content)
+++ after: xrdp.ini (content)
@@ -1 +1,2 @@
 security_layer=tls
+port=3391

changed: [localhost]

If the option 'port' is present in the file the same task will also replace any port's value by the value of xrdp_port

shell> cat xrdp.ini
port=3999
TASK [lineinfile] **************************************************
--- before: xrdp.ini (content)
+++ after: xrdp.ini (content)
@@ -1 +1 @@
-port=3999
+port=3391

changed: [localhost]

Upvotes: 1

Related Questions