Ansible: изменение разрешения проблемы с каталогом

Я запускаю следующую задачу Ansible, чтобы изменить разрешение каталога и его содержимого.

- name: Change ownership of everything below /opt/as2/app-server
  file: path=/opt/as2/app-server state=directory recurse=yes owner=adrt group=adrt

При запуске я получаю следующую проблему:

ЗАДАЧА [сервер приложений: сменить владельца всего ниже /opt/as2/app-server] ****
фатальный: [192.168.1.182]: НЕУДАЧА! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "Traceback (последний последний вызов):\r\n File \"/tmp/ansible_UrBo6x/ansible_module_file.py \", строка 451, в \r\n main()\r\n File \"/tmp/ansible_UrBo6x/ansible_module_file.py\", строка 335, в main\r\n изменено |= recursive_set_attributes(module, to_bytes( file_args['path'], errors='surrogate_or_strict'), follow, file_args)\r\n File \"/tmp/ansible_UrBo6x/ansible_module_file.py\", строка 146, в recursive_set_attributes\r\n изменено |= модуль. set_fs_attributes_if_ Different (tmp_file_args, изменено)\r\n Файл \"/tmp/ansible_UrBo6x/ansible_modlib.zip/ansible/module_utils/basic.py\", строка 1163, в set_fs_attributes_if_ Different\r\n Файл \"/tmp/ansible_UrBo6x/ansible_modlib .zip/ansible/module_utils/basic.py\", строка 929, в set_owner_if_ Different\r\n File \"/tmp/ansible_UrBo6x/ansible_modlib.zip/ansible/module_utils/basic.py\", строка 842, в user_and_group\ r\nOSError: [Errno 2] Нет такого файла или каталога: '/opt/as2/a pp-server-1.0.0/apps/station/WEB-INF/classes/org/adroitlogic/isuite/metrics/As2MetricsService/usr/bin/python$tt__collectStats_closure14.class'\r\n", "msg": "MODULE ОТКАЗ"}

В основном он говорит, что нет такого файла или каталога, как

/opt/as2/app-server-1.0.0/apps/station/WEB-INF/classes/org/adroitlogic/isuite/metrics/As2MetricsService/usr/bin/python$tt__collectStats_closure14.class

Содержимое каталога /opt/as2/app-server/apps/station/WEB-INF/classes/org/adroitlogic/isuite/metrics/ есть,

As2MetricsService$_$tt__CountStatisticsLists_closure3.class
As2MetricsService$_$tt__collectStats_closure10.class
As2MetricsService$_$tt__collectStats_closure11.class
As2MetricsService$_$tt__collectStats_closure12.class
As2MetricsService$_$tt__collectStats_closure13.class
As2MetricsService$_$tt__collectStats_closure14.class
As2MetricsService$_$tt__collectStats_closure15.class
As2MetricsService$_$tt__collectStats_closure4.class
As2MetricsService$_$tt__collectStats_closure5.class
As2MetricsService$_$tt__collectStats_closure6.class
As2MetricsService$_$tt__collectStats_closure7.class
As2MetricsService$_$tt__collectStats_closure8.class
As2MetricsService$_$tt__collectStats_closure9.class
As2MetricsService$_CountStatisticsLists_closure1.class
As2MetricsService$_collectStats_closure2.class
As2MetricsService.class

Подкаталогов нет.

Также, когда я запускаю команду chown -R adrt:adrt . внутри каталога /opt/as2/app-server, она выполняется без проблем.

Помогите мне понять, что здесь происходит.


person dammina    schedule 20.01.2017    source источник
comment
к сожалению, для меня это не так очевидно.   -  person dammina    schedule 20.01.2017
comment
Вы собираетесь отправить вопрос на GitHub?   -  person techraf    schedule 20.01.2017
comment
Да, я собирался сделать это.   -  person dammina    schedule 20.01.2017
comment
@techraf сообщил на github.com/ansible/ansible/issues/20496. Пожалуйста, дайте мне знать, если это требует изменения.   -  person dammina    schedule 20.01.2017
comment
Не мне решать, что хорошо, а что плохо, но раз уж вы спрашиваете... На первый взгляд, думаю, не стоит смущать читателей этим длинным путем. Он терпит неудачу даже ./testdir/test$_$file.   -  person techraf    schedule 20.01.2017


Ответы (1)


Помогите мне понять, что здесь происходит.

Вы только что обнаружили ошибку в Ansible, которая приводит к сбою модулей, когда имена обрабатываемых файлов содержат последовательность $_.

Имя передается без экранирования символа $ (вернее, с явным запросом на преобразование os.path.expandvars(filename)), а последовательность $_ обрабатывается как встроенная переменная, определяющая путь текущего процесса (в данном случае /usr/bin/python, поскольку Ansible использует Python для запуска своих модулей) .

В результате имя файла:

As2MetricsService$_$tt__collectStats_closure14.class

интерпретируется как:

As2MetricsService/usr/bin/python$tt__collectStats_closure14.class

и система выдает ошибку, что файла не существует (что правда).


Пока это не исправлено, я думаю, вам нужно вызвать chown с модулем command

person techraf    schedule 20.01.2017