Не удалось получить опцию исключения, работающую с модулем разархивирования

У меня есть файл tar/gzip, который я извлекаю в список хостов, используя модуль unarchive.

Ниже приведен неполный список содержимого файла configs.tgz:

-rw-rw-r-- ian/ian        1295 2015-09-25 15:27 Makefile
-rw-rw-r-- ian/ian          16 2016-06-21 09:24 .configs
drwxrwxr-x ian/ian           0 2016-02-24 10:18 .bash/
-rw-rw-r-- ian/ian         336 2015-09-25 15:27 .bash/apt.b
-rw-rw-r-- ian/ian         367 2015-09-25 15:27 .bash/gcloud.b
drwxrwxr-x ian/ian           0 2016-06-21 09:22 .vim/
drwxrwxr-x ian/ian           0 2016-06-21 09:22 .vim/plugin/
-rw-rw-r-- ian/ian        3327 2016-06-21 09:17 .vim/plugin/scratch.vim
drwxrwxr-x ian/ian           0 2015-09-25 15:27 .vim/ftplugin/
-rw-rw-r-- ian/ian         521 2015-09-25 15:27 .vim/ftplugin/dokuwiki.vim
-rw-rw-r-- ian/ian        2456 2015-09-25 15:27 .vim/ftplugin/nagios.vim
drwxrwxr-x ian/ian           0 2015-09-25 15:27 .vim/ftdetect/
-rw-rw-r-- ian/ian         149 2015-09-25 15:27 .vim/ftdetect/nagios.vim
-rw-rw-r-- ian/ian         111 2015-09-25 15:27 .vim/ftdetect/zsh-profile.vim
-rw-rw-r-- ian/ian         554 2015-09-25 15:27 .zshrc
drwxrwxr-x ian/ian           0 2015-09-25 15:27 .mutt/
lrwxrwxrwx ian/ian           0 2015-09-25 15:27 .mutt/profile.active -> profile.gmail
-rw-rw-r-- ian/ian         863 2015-09-25 15:27 .mutt/everyone.lst
-rw-rw-r-- ian/ian         310 2015-09-25 15:27 .mutt/vimrc4mail
-rw-rw-r-- ian/ian       11559 2015-09-25 15:27 .mutt/muttrc
-rw-rw-r-- ian/ian         441 2015-09-25 15:27 .screenrc
-rw-rw-r-- ian/ian         131 2015-09-25 15:27 .tmux.conf
-rwxrwxr-x ian/ian        1439 2015-09-25 15:27 xmake

Я хотел бы извлечь все, кроме каталога .mutt, но я не могу заставить параметр исключения работать правильно.

Вот что я получаю:

% ansible --version
ansible 2.1.0.0
  config file = /home/ian/Playbooks/ansible.cfg
  configured module search path = Default w/o overrides

% rm -rf /tmp/a; mkdir /tmp/a && ansible localhost -m unarchive -a "src=configs/configs.tgz dest=/tmp/a/ exclude='.mutt'" -vvv
Using /home/ian/Playbooks/ansible.cfg as config file
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: ian
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1466558533.54-272347310038797 `" && echo ansible-tmp-1466558533.54-272347310038797="` echo $HOME/.ansible/tmp/ansible-tmp-1466558533.54-272347310038797 `" ) && sleep 0'                                                                                                  
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1466558533.64-181689590644032 `" && echo ansible-tmp-1466558533.64-181689590644032="` echo $HOME/.ansible/tmp/ansible-tmp-1466558533.64-181689590644032 `" ) && sleep 0'                                                                                                  
<localhost> PUT /tmp/tmp9TwX54 TO /home/ian/.ansible/tmp/ansible-tmp-1466558533.64-181689590644032/stat
<localhost> EXEC /bin/sh -c 'LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/ian/.ansible/tmp/ansible-tmp-1466558533.64-181689590644032/stat; rm -rf "/home/ian/.ansible/tmp/ansible-tmp-1466558533.64-181689590644032/" > /dev/null 2>&1 && sleep 0'                                                                                                            
<localhost> PUT configs/configs.tgz TO /home/ian/.ansible/tmp/ansible-tmp-1466558533.54-272347310038797/source
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1466558533.94-189956548033565 `" && echo ansible-tmp-1466558533.94-189956548033565="` echo $HOME/.ansible/tmp/ansible-tmp-1466558533.94-189956548033565 `" ) && sleep 0'                                                                                                  
<localhost> PUT /tmp/tmp2xgO6E TO /home/ian/.ansible/tmp/ansible-tmp-1466558533.94-189956548033565/unarchive
<localhost> EXEC /bin/sh -c 'LANG=C LC_ALL=C LC_MESSAGES=C /usr/bin/python /home/ian/.ansible/tmp/ansible-tmp-1466558533.94-189956548033565/unarchive; rm -rf "/home/ian/.ansible/tmp/ansible-tmp-1466558533.94-189956548033565/" > /dev/null 2>&1 && sleep 0'                                                                                                       
<localhost> EXEC /bin/sh -c 'rm -f -r /home/ian/.ansible/tmp/ansible-tmp-1466558533.54-272347310038797/ > /dev/null 2>&1 && sleep 0'                                                                                                          
localhost | FAILED! => {
    "changed": false,                                                                                                  
    "failed": true,                                                                                                    
    "invocation": {                                                                                                    
        "module_args": {
            "backup": null, 
            "content": null, 
            "copy": true, 
            "creates": null, 
            "delimiter": null, 
            "dest": "/tmp/a/", 
            "directory_mode": null, 
            "exclude": [
                ".mutt"
            ], 
            "extra_opts": [], 
            "follow": false, 
            "force": null, 
            "group": null, 
            "keep_newer": false, 
            "list_files": false, 
            "mode": null, 
            "original_basename": "configs.tgz", 
            "owner": null, 
            "regexp": null, 
            "remote_src": null, 
            "selevel": null, 
            "serole": null, 
            "setype": null, 
            "seuser": null, 
            "src": "/home/ian/.ansible/tmp/ansible-tmp-1466558533.54-272347310038797/source"
        }
    }, 
    "msg": "path /tmp/a/.mutt/profile.active does not exist", 
    "path": "/tmp/a/.mutt/profile.active", 
    "state": "absent"
}

Я пробовал различные варианты опции «исключить», в том числе

exclude='[ ".mutt" ]'
exclude='[ ".mutt", ".mutt/*" ]'

Похоже, они работают, но я всегда получаю извлечение всего содержимого каталога .mutt.

Где я ошибаюсь?


person Ian Petts    schedule 22.06.2016    source источник
comment
Пробовали ли вы использовать другой тип архива — .zip, .bz? Установлен ли gunzip, bunzip и т. д.? Также как насчет указания абсолютного пути к .mutt , то есть /.mutt или /.mutt/.   -  person cachonfinga    schedule 23.06.2016
comment
В последнем выпуске ansible есть проблемы с компонентами exclude и strip.   -  person Konstantin Suvorov    schedule 24.06.2016
comment
@Rowley извините за задержку с ответом, я ценю вашу помощь. Я пробовал zip, bz2 и несжатый tar с тем же результатом. Я обнаружил, что мне нужен список YAML, как описано в отчете об ошибке, на который ссылается @Konstantin-Suvorov, и ваше предложение об абсолютном пути привело меня к выводу, что записи должны точно совпадать с записями в архиве - ./.mutt в моем случае.   -  person Ian Petts    schedule 26.06.2016


Ответы (1)


Согласно комментариям, для этой проблемы зарегистрирована ошибка.

Обходной путь — использовать список YAML для исключений и убедиться, что список точно соответствует пути/файлу, хранящемуся в архиве.

vars:
  exclusions:
    - ./.mutt

а также

unarchive: src=configs/configs.tgz dest=/tmp/a exclude={{ exclusions }}
person Ian Petts    schedule 26.06.2016