我的/ 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}}。
答案 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}}"