Ansible:解析/连接getent模块的输出

时间:2017-11-18 17:46:16

标签: json ansible ansible-template

我尝试为sftp用户设置chroot,以便他们可以ls -lthis 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"}

  1. getent_passwd提供的值提供给由"加入的一个扁平字符串的正确方法是什么:"?
  2. 使用key: "root"这种方式而不是echo "root:x:0:0:not really root:::" >> /chroots/sftpuser/etc/passwd使用genent模块是否安全?
  3. 可以运行getent passwd user1 user2 - 是否有可能以某种方式向ansible的getent模块提供两个密钥?

1 个答案:

答案 0 :(得分:1)

  

getent_passwd提供的值提供给由"加入的一个扁平字符串的正确方法是什么:"?

例如,使用带有join filter的Jinja2模板:

- debug:
    msg: "{{ user.username }}:{{getent_passwd[user.username]|join(':')}}"
  

可以运行getent passwd user1 user2 - 是否有可能以某种方式向ansible的getent模块提供两个密钥?

没有。无论是单个还是全部。

使用外部循环在第一种情况下请求值,或者在第二种情况下过滤结果列表。