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