2015-11-05 36 views

回答

15

不幸的是,所有的with_*循環機制都是本地查找,所以在Ansible中沒有真正乾淨的方法來做到這一點。遠程操作設計必須包含在任務中,因爲它需要處理連接和庫存等。

你可以做的是通過對主機進行脫殼生成你的fileglob,然後註冊輸出並在stdout_lines部分循環的輸出。

所以一個簡單的例子可能是這樣的:

- name : get files in /path/ 
    shell : ls /path/* 
    register: path_files 

- name: fetch these back to the local Ansible host for backup purposes 
    fetch: 
    src : /path/"{{item}}" 
    dest: /path/to/backups/ 
    with_items: "{{ path_files.stdout_lines }}" 

這將連接到遠程主機(例如,host.example.com),得到/path/下的所有文件名,然後將它們複製回Ansible主機到路徑:/path/host.example.com/

+0

根據您的經驗,當您執行此操作時,Windows和Linux之間的行結束是否存在問題?例如。會有''with_items'是空的複製stdout從'dir/b'回來? – Nick

2

使用ls /path/*我沒有工作,所以這裏是一個使用find和一些簡單的正則表達式來刪除所有nginx的託管虛擬主機的例子:

- name: get all managed vhosts 
    shell: find /etc/nginx/sites-enabled/ -type f -name \*-managed.conf 
    register: nginx_managed_virtual_hosts 

- name: delete all managed nginx virtual hosts 
    file: 
    path: "{{ item }}" 
    state: absent 
    with_items: "{{ nginx_managed_virtual_hosts.stdout_lines }}" 

你可以用它來查找所有文件與特定的延長或任何其他組合。例如,要簡單地獲取目錄中的所有文件:find /etc/nginx/sites-enabled/ -type f