Нужно найти файл conf в системе и заменить строку

Все, я использую приведенный ниже сценарий, чтобы найти все файлы httpd.conf в /tmp с помощью модуля поиска, и после этого мне нужно изменить корень сервера для всех файлов httpd.conf, которые я получил из модуля поиска. Я использую приведенный ниже код. получение приведенной ниже ошибки при выполнении модуля lineinline.

fatal: [localhost]: FAILED! => {"changed": false, "msg": "Destination {'files': [{'uid': 0, 'woth': False, 'mtime': 1554392266.9903164, 'inode': 4232796, 'isgid': False, 'size': 11753, 'roth': True, 'isuid': False, 'isreg': True, 'pw_name': 'root', 'gid': 0, 'ischr': False, 'wusr': True, 'xoth': False, 'rusr': True, 'nlink': 1, 'issock': False, 'rgrp': True, 'gr_name': 'root', 'path': '/tmp/httpd.conf', 'xusr': False, 'atime': 1554391744.8432574, 'isdir': False, 'ctime': 1554392266.9903164, 'wgrp': False, 'xgrp': False, 'dev': 51714, 'isblk': False, 'isfifo': False, 'mode': '0644', 'islnk': False}], 'changed': False, 'failed': False, 'examined': 14, 'msg': '', 'matched': 1} does not exist !", "rc": 257} to retry, use: --limit @/etc/ansible/findnew.retry

---
- name: Recursively find httpd.conf file in /tmp 
  connection: local
  hosts: localhost
  tasks:
   - find:
       paths: /tmp
       patterns: '*.conf'
       recurse: yes
     register: filestoser
   - debug: var=filestoser
   - lineinfile:
       path: '{{ filestoser }}'
       state: present
       regexp: '^ServerRoot'
       line: 'ServerRoot_new'
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
0
0
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что вы пытаетесь использовать переменную filestoser в качестве имени файла, но это не так: это результат задачи find. Если вы посмотрите на результат своей задачи debug, вы увидите что-то вроде этого:

TASK [debug] **********************************************************************************
ok: [localhost] => {
    "filestoser": {
        "changed": false,
        "examined": 44,
        "failed": false,
        "files": [
            {
                "atime": 1554394659.885133,
                "ctime": 1554394659.885133,
                "dev": 45,
                "gid": 21937,
                "gr_name": "lars",
                "inode": 172846,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1554394659.885133,
                "nlink": 1,
                "path": "/tmp/etc/httpd/httpd.conf",
                "pw_name": "lars",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 11753,
                "uid": 21937,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            }
        ],
        "matched": 1,
        "msg": ""
    }
}

Другими словами, filestoser — это словарь. Ключ files содержит список файлов, которые были сопоставлены задачей files. Вы можете переписать задачу lineinfile следующим образом, если хотите работать с первым найденным файлом:

- lineinfile:
    path: '{{ filestoser.files.0.path }}'
    state: present
    regexp: '^ServerRoot'
    line: 'ServerRoot_new'

Другие вопросы по теме