如何在本地目录中构建文件名列表?

How to build a list of file names in a local directory?

我的 /files 文件夹中有一堆 .keys 文件。我想要做的是在匹配这些密钥文件的远程主机上创建用户。

假设我在 /files 中有 alice.keys、bob.keys 和 john.keys。我希望脚本创建 alice、bob 和 john 用户(如果它们不存在)并且 update/add 来自每个用户的适当 .keys 文件的 SSH 密钥。

我知道我可以使用 loop 模块来循环文件,但我不知道如何形成只包含文件名的列表,所以我可以稍后使用它。

我的角色结构如下:

sshrole
├── defaults
│   └── main.yml
├── files
│   ├── alice.keys
│   ├── bob.keys
│   └── john.keys
├── handlers
│   └── main.yml
├── README.md
├── tasks
│   ├── main.yml
│   ├── setup.yml
│   ├── update.yml
│   ├── useradd.yml
│   └── userdel.yml
├── templates
│   └── ssh_config.j2
└── vars
    └── main.yml

简而言之,我想要的是一个包含 {'alice', 'bob', 'john'} 个值的变量 ssh_users

更新: 以接受的答案为指导,我决定执行如下任务:

- name: Extract user-names.
  shell: echo {{item}} | sed 's/.*\/\(.*\)\.keys//'
  register: sed_commands
  with_fileglob: ../files/*.keys

然后我在其他任务中使用{{sed_commands.results}}。

您可以使用 with_fileglob 循环获取文件列表和内容,如下所示:

- hosts: target
  tasks:

    - command: cat {{item}}
      register: ssh_keys
      with_fileglob: files/*.keys
      delegate_to: localhost

完成后,您将拥有一个包含 results 键的变量 ssh_keys,这是一个字典列表,其中 item 是文件名,stdout将包含文件的内容。也就是说,它看起来像这样:

"ssh_keys": {
    "changed": true, 
    "msg": "All items completed", 
    "results": [
        {
            "item": "/home/lars/tmp/filetetst/files/john.keys", 
            "stdout": "ssh-rsa ...",
        }, 
        {
            "item": "/home/lars/tmp/filetetst/files/alice.keys", 
            "stdout": "ssh-rsa ...",
        }, 
        {
            "item": "/home/lars/tmp/filetetst/files/bob.keys", 
            "stdout": "ssh-rsa ...",
        }, 
    ]
}

您可以在 with_items 循环中使用它来实际更改配置。

- hosts: target
  tasks:

    - command: cat {{item}}
      register: ssh_keys
      with_fileglob: files/*
      delegate_to: localhost

- hosts: target
  tasks:

    - user:
        # username is the last path component of the
        # filename (item.item.split('/')[-1]), and then 
        # we need to remove .keys ([:-5]).
        name: "{{item.item.split('/')[-1][:-5]}}"
      with_items: "{{ssh_keys.results}}"

    - authorized_key:
        user: "{{item.item.split('/')[-1][:-5]}}"
        key: "{{item.stdout}}"
        manage_dir: yes
      with_items: "{{ssh_keys.results}}"