← Назад к вопросам

Каким модулем можно поменять строку в файле в Ansible?

1.0 Junior🔥 232 комментариев
#Ansible и управление конфигурацией

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные модули Ansible для замены строк в файлах

В Ansible существует несколько модулей для замены строк в файлах, и выбор конкретного зависит от ваших задач. Вот основные варианты:

lineinfile — основной модуль для работы с отдельными строками

Это самый популярный и гибкий модуль для замены или управления отдельными строками в файле.

- name: Replace a specific line in a file
  ansible.builtin.lineinfile:
    path: /etc/ssh/sshd_config
    regexp: '^PasswordAuthentication'
    line: 'PasswordAuthentication no'
    state: present

Ключевые параметры:

  • regexp — регулярное выражение для поиска строки
  • line — новая строка для вставки
  • statepresent (добавить/заменить) или absent (удалить)
  • backrefs — позволяет использовать группы из regexp в строке замены
  • insertafter/insertbefore — указать, куда вставить строку, если она не найдена

replace — модуль для замены текста по шаблону

Более мощный модуль для замены текста, который работает с регулярными выражениями в многострочном режиме.

- name: Replace multiple occurrences of a pattern
  ansible.builtin.replace:
    path: /etc/nginx/nginx.conf
    regexp: 'listen 80;'
    replace: 'listen 8080;'

Отличия от lineinfile:

  • Может заменять текст, разбитый на несколько строк
  • Заменяет все вхождения, а не только первую строку
  • Не добавляет строку, если шаблон не найден

blockinfile — работа с блоками текста

Идеален для замены или вставки многострочных блоков текста.

- name: Replace a configuration block
  ansible.builtin.blockinfile:
    path: /etc/profile
    marker: "# {mark} ANSIBLE MANAGED BLOCK"
    block: |
      export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
      export PATH=$JAVA_HOME/bin:$PATH
    state: present

template — генерация файлов из шаблонов Jinja2

Если нужно полностью контролировать содержимое файла на основе переменных и логики.

- name: Create configuration from template
  ansible.builtin.template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    mode: '0644'

Практические примеры и сравнение

Когда что использовать:

  1. lineinfile — для точечных изменений в конфигурационных файлах:

    - name: Disable root SSH login
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^PermitRootLogin'
        line: 'PermitRootLogin no'
    
  2. replace — для комплексных замен:

    - name: Update all IP addresses in config
      replace:
        path: /etc/haproxy/haproxy.cfg
        regexp: '192\.168\.1\.\d{1,3}'
        replace: '10.0.0.1'
    
  3. blockinfile — для добавления настроек:

    - name: Add environment variables
      blockinfile:
        path: /etc/environment
        block: |
          LC_ALL=en_US.UTF-8
          LANG=en_US.UTF-8
    

Продвинутые техники

Использование backrefs в lineinfile:

- name: Update port in configuration with backreference
  lineinfile:
    path: /etc/service.conf
    regexp: '^(port\s*=\s*)(\d+)'
    line: '\18080'
    backrefs: yes

Комбинация модулей для комплексных задач:

- name: Ensure SSH configuration is secure
  block:
    - name: Disable password authentication
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#?PasswordAuthentication'
        line: 'PasswordAuthentication no'
    
    - name: Change SSH port
      replace:
        path: /etc/ssh/sshd_config
        regexp: '^#?Port 22'
        replace: 'Port 2222'
    
    - name: Add warning banner
      blockinfile:
        path: /etc/ssh/sshd_config
        block: |
          Banner /etc/ssh/warning_banner
        marker: "# {mark} SSH BANNER"

Важные замечания

  • Идемпотентность — все модули идемпотентны (при повторном запуске не меняют уже настроенное)
  • Резервное копирование — используйте параметр backup: yes для создания резервных копий
  • Валидация — после изменения конфигурационных файлов всегда проверяйте их валидность
  • Атомарность — для критически важных файлов рассмотрите создание временного файла с последующим перемещением

Вывод: для простой замены строки используйте lineinfile, для замены по шаблону — replace, для работы с блоками — blockinfile, а для генерации файлов из шаблонов — template. Выбор модуля зависит от конкретной задачи и структуры файла, с которым вы работаете.