# ansible.builtin.lineinfile
This module ensures a particular line is in a file, or replace an existing line using a back-referenced [regular expression](../../Regex.md).

## Parameter
| Parameter         | Type    | Default   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ----------------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **attributes**    | string  | -         | The attributes the resulting filesystem object should have. To get supported flags look at the man page for [chattr](../../../applications/cli/chattr.md) on the target system. The = operator is assumed as default, otherwise + or - operators need to be included in the string.                                                                                                                                                                                                  |
| **backup**        | boolean | false     | Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it incorrectly.                                                                                                                                                                                                                                                                                                                                              |
| **create**        | boolean | false     | Create a new file if it does not exist.                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| **firstmatch**    | boolean | false     | Used with `insertafter` or `insertbefore`.  If set, `insertafter` and `insertbefore` will work with the first line that matches the given [regular expression](../../Regex.md).                                                                                                                                                                                                                                                                                                      |
| **group**         | string  | false     | Name of the group that should own the filesystem object, as would be fed to _chown_.                                                                                                                                                                                                                                                                                                                                                                                                 |
| **insertafter**   | string  | -         | Used with `state=present`.<br><br>If specified, the line will be inserted after the last match of specified [regular expression](../../Regex.md).<br><br>If the first match is required, use(`firstmatch=yes`).<br><br>A special value is available; `EOF` for inserting the line at the end of the file.<br><br>If specified [regular expression](../../Regex.md) has no matches, `EOF` will be used instead.<br><br>If `insertbefore` is set, default value `EOF` will be ignored. |
| **insertbefore**  | string  | -         | Used with `state=present`.<br><br>If specified, the line will be inserted before the last match of specified [regular expression](../../Regex.md).<br><br>If the first match is required, use `firstmatch=yes`.<br><br>A value is available; `BOF` for inserting the line at the beginning of the file.<br><br>If specified [regular expression](../../Regex.md) has no matches, the line will be inserted at the end of the file.                                                   |
| **line**          | string  | -         | The line to insert/replace into the file.                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| **mode**          | string  | -         | The permissions the resulting filesystem object should have.                                                                                                                                                                                                                                                                                                                                                                                                                         |
| **owner**         | string  | -         | Name of the user that should own the filesystem object, as would be fed to _chown_.                                                                                                                                                                                                                                                                                                                                                                                                  |
| **path**          | path    | -         | The file to modify.                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **regexp**        | string  | -         | The [regular expression](../../Regex.md) to look for in every line of the file.                                                                                                                                                                                                                                                                                                                                                                                                      |
| **search_string** | string  | -         | The literal string to look for in every line of the file. This does not have to match the entire line.                                                                                                                                                                                                                                                                                                                                                                               |
| **state**         | string  | "present" | Whether the line should be there or not.<br><br>Choices:<br><br>- `absent`<br>- `present`                                                                                                                                                                                                                                                                                                                                                                                            |
| **validate**      | string  | -         | The validation command to run before copying the updated file into the final destination.                                                                                                                                                                                                                                                                                                                                                                                            |

## Examples
```yaml
# NOTE: Before 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
- name: Ensure SELinux is set to enforcing mode
  ansible.builtin.lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=enforcing

- name: Make sure group wheel is not in the sudoers configuration
  ansible.builtin.lineinfile:
    path: /etc/sudoers
    state: absent
    regexp: '^%wheel'

- name: Replace a localhost entry with our own
  ansible.builtin.lineinfile:
    path: /etc/hosts
    regexp: '^127\.0\.0\.1'
    line: 127.0.0.1 localhost
    owner: root
    group: root
    mode: '0644'

- name: Replace a localhost entry searching for a literal string to avoid escaping
  ansible.builtin.lineinfile:
    path: /etc/hosts
    search_string: '127.0.0.1'
    line: 127.0.0.1 localhost
    owner: root
    group: root
    mode: '0644'

- name: Ensure the default Apache port is 8080
  ansible.builtin.lineinfile:
    path: /etc/httpd/conf/httpd.conf
    regexp: '^Listen '
    insertafter: '^#Listen '
    line: Listen 8080

- name: Ensure php extension matches new pattern
  ansible.builtin.lineinfile:
    path: /etc/httpd/conf/httpd.conf
    search_string: '<FilesMatch ".php[45]?$">'
    insertafter: '^\t<Location \/>\n'
    line: '        <FilesMatch ".php[34]?$">'

- name: Ensure we have our own comment added to /etc/services
  ansible.builtin.lineinfile:
    path: /etc/services
    regexp: '^# port for http'
    insertbefore: '^www.*80/tcp'
    line: '# port for http by default'

- name: Add a line to a file if the file does not exist, without passing regexp
  ansible.builtin.lineinfile:
    path: /tmp/testfile
    line: 192.168.1.99 foo.lab.net foo
    create: yes

# NOTE: Yaml requires escaping backslashes in double quotes but not in single quotes
- name: Ensure the JBoss memory settings are exactly as needed
  ansible.builtin.lineinfile:
    path: /opt/jboss-as/bin/standalone.conf
    regexp: '^(.*)Xms(\d+)m(.*)$'
    line: '\1Xms${xms}m\3'
    backrefs: yes

# NOTE: Fully quoted because of the ': ' on the line. See the Gotchas in the YAML docs.
- name: Validate the sudoers file before saving
  ansible.builtin.lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%ADMIN ALL='
    line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
    validate: /usr/sbin/visudo -cf %s

# See https://docs.python.org/3/library/re.html for further details on syntax
- name: Use backrefs with alternative group syntax to avoid conflicts with variable values
  ansible.builtin.lineinfile:
    path: /tmp/config
    regexp: ^(host=).*
    line: \g<1>{{ hostname }}
    backrefs: yes
```