是否with_fileglob在ansible中远程工作?

时间:2015-11-05 11:36:21

标签: ansible ansible-playbook

是否有with_fileglob在ansible远程工作?

主要是我确实希望使用与with_fileglob类似的东西,但这会使远程/目标机器上的文件全局化,而不是运行ansible的文件。

4 个答案:

答案 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