我尝试为sftp用户设置chroot,以便他们可以ls -l
按this article查看用户/组名称。为此,我需要输出getent
命令并将其放入/chroots/{{ user.username }}/etc/passwd
文件中。
我尝试使用Ansible替换此命令getent passwd sftpuser > /chroots/sftpuser/etc/passwd
,如下所示:
- name: get {{ user.username }} user info
getent:
database: passwd
key: "{{ user.username }}"
- debug:
var: getent_passwd
- name: create /chroots/{{ user.username }}/etc/passwd file
lineinfile:
path: /chroots/{{ user.username }}/etc/passwd
line: "{{ getent_passwd | from_json }}"
state: present
create: yes
owner: root
group: root
mode: '0644'
' getent_passwd'看起来如下:
ok: [cf1] => {
"getent_passwd": {
"testuser1": [
"x",
"1001",
"1002",
"",
"/home/testuser1",
"/usr/sbin/nologin"
]
}
}
但是我收到了这个错误:FAILED! => {"failed": true, "msg": "Unexpected templating type error occurred on ({{ getent_passwd | from_json }}): expected string or buffer"}
getent_passwd
提供的值提供给由"加入的一个扁平字符串的正确方法是什么:"?key: "root"
这种方式而不是echo "root:x:0:0:not really root:::" >> /chroots/sftpuser/etc/passwd
使用genent模块是否安全?getent passwd user1 user2
- 是否有可能以某种方式向ansible的getent模块提供两个密钥?答案 0 :(得分:1)
将
getent_passwd
提供的值提供给由"加入的一个扁平字符串的正确方法是什么:"?
例如,使用带有join
filter的Jinja2模板:
- debug:
msg: "{{ user.username }}:{{getent_passwd[user.username]|join(':')}}"
可以运行getent passwd user1 user2 - 是否有可能以某种方式向ansible的getent模块提供两个密钥?
没有。无论是单个还是全部。
使用外部循环在第一种情况下请求值,或者在第二种情况下过滤结果列表。