是否有with_fileglob
在ansible远程工作?
主要是我确实希望使用与with_fileglob
类似的东西,但这会使远程/目标机器上的文件全局化,而不是运行ansible的文件。
答案 0 :(得分:19)
不幸的是,所有with_*
循环机制都是本地查找,所以在Ansible中没有真正干净的方法。设计中的远程操作必须包含在处理连接和库存等所需的任务中。
你可以做的是通过shelling到主机然后注册输出并循环输出的stdout_lines
部分来生成你的fileglob。
所以一个简单的例子可能是这样的:
- 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/
。
答案 1 :(得分:11)
使用find
module过滤文件,然后处理结果列表:
- name: Get files on remote machine
find:
paths: /path/on/remote
register: my_find
- debug:
var: item.path
with_items: "{{ my_find.files }}"
答案 2 :(得分:3)
使用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
。
答案 3 :(得分:0)
这是一种方法,您可以遍历所有找到的内容。在我的示例中,我必须查找所有pip实例来擦除awscli,以准备安装awscli v2.0。我用lineinfile做过类似的操作,以去除/ etc / skel dotfiles中的vars
- name: search for pip
find:
paths: [ /usr/local/bin, /usr/bin ]
file_type: any
pattern: pip*
register: foundpip
- name: Parse out pip paths (say that 3 times fast)
set_fact:
pips: "{{ foundpip | json_query('files[*].path') }}"
- name: List all the found versions of pip
debug:
msg: "{{ pips }}"
#upgrading pip often leaves broken symlinks or older wrappers behind which doesn't affect pip but breaks playbooks so ignore!
- name: remove awscli with found versions of pip
pip:
name: awscli
state: absent
executable: "{{ item }}"
loop: "{{ pips }}"
ignore_errors: yes