如何在本地目录中构建文件名列表?
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}}"
我的 /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}}"