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

#ansible

#ansible

Вопрос:

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

фатальный: [localhost]: СБОЙ! => {«изменено»: false, «msg»: «Назначение {‘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} не существует!», «rc»: 257} для повторной попытки используйте: —limit @ /etc/ansible/findnew.повторить попытку

 ---
- 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'
  

Ответ №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'