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

时间:2015-10-29 17:29:36

标签: ansible

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

假设我在/ files中有alice.keys,bob.keys和john.keys。我希望脚本创建alice,bob和john用户(如果它们不存在)并从适当的.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

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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

- hosts: target
  tasks:

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

完成此操作后,您将拥有一个包含ssh_keys键的变量results,该键是一个词典列表,其中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}}"