通过 ansible 创建非交互式 samba 用户

问题描述 投票:0回答:6

虽然在 shell 中输入以下命令可以工作

echo -ne "myser\nmypass\n" | smbpasswd -a -s myuser

以下任务在ansible中失败

  - name: add dms samba user
    command: echo -ne "myuser\nmypass\n" | smbpasswd -a -s myuser
    notify: restart samba

它不会产生任何错误,但不会创建用户。

ansible 2.3.0.0
一起工作
Ubuntu 16.0.4.

ansible samba
6个回答
12
投票

如上所述,管道不能与命令模块一起使用。我过去曾使用类似的方法来创建 Samba 用户:

- name: Configure Samba users.
  shell: >
    (pdbedit --user={{ item.username }} 2>&1 > /dev/null)
    || (echo '{{ item.password }}'; echo '{{ item.password }}')
    | smbpasswd -s -a {{ item.username }}
  register: smbpasswd
  changed_when: "'Added user' in smbpasswd.stdout"
  with_items: "{{ samba_users }}"
  loop_control:
    label: "{{ item.username }}"

仅当用户尚不存在时任务才会运行。因此更改密码不适用于此示例。


9
投票

我稍微改进了 siwydTormod Macleod 的代码。 谢谢你们俩!

- name: shell - create samba users
  ansible.builtin.shell: >
    set -e -o pipefail
    && (pdbedit --user='{{ item.username }}' 2>&1 > /dev/null)
    || (echo '{{ item.password }}'; echo '{{ item.password }}')
    | smbpasswd -s -a '{{ item.username }}'
  args:
    executable: /bin/bash
  register: samba_create_users
  changed_when: "'Added user' in samba_create_users.stdout"
  loop: "{{ samba_users }}"
  no_log: true

- name: shell - set samba passwords correctly
  ansible.builtin.shell: >
    set -e -o pipefail
    && (smbclient -U '{{ item.username }}'%'{{ item.password }}' -L 127.0.0.1 2>&1 > /dev/null)
    || (echo '{{ item.password }}'; echo '{{ item.password }}')
    | smbpasswd '{{ item.username }}'
  args:
    executable: /bin/bash
  register: samba_verify_users
  changed_when: "'New SMB password' in samba_verify_users.stdout"
  loop: "{{ samba_users }}"
  no_log: true

变化:


3
投票

请使用您的 Ansible Playbook 尝试此方法:

- name: set Samba passwords for each user
  shell: "printf '{{ item.passwd }}\n{{ item.passwd }}\n' | smbpasswd -a {{ item.name }}"
  with_items:
  - "{{ users }}"
  tags: smbpasswd

请注意,您需要将包含

users:
的变量文件映射为以下格式:

users:
- name: userName
  passwd: myClearTextPassword

请注意,为了支持 smbpasswd,您将以明文形式传递此密码。此外,请注意这只是需要包含在您的剧本中的一项任务。


1
投票
上面

siwyd的回答非常好。我一直在努力弄清楚如何以幂等的方式解决这个问题,直到我看到这个。对于我的用例,我希望保持密码同步,因此我添加了另一个游戏来做到这一点。可能对某人有用

- name: shell - create samba users shell: > (pdbedit --user={{ item.username }} 2>&1 > /dev/null) || (echo '{{ item.password }}'; echo '{{ item.password }}') | smbpasswd -s -a {{ item.username }} register: create_samba_users changed_when: "'Added user' in create_samba_users.stdout" become: true with_items: "{{ samba_users }}" loop_control: label: "{{ item.username }}" - name: shell - set samba passwords correctly shell: > (smbclient -U {{ item.username }}%{{ item.password }} -L 127.0.0.1 2>&1 > /dev/null) || (echo '{{ item.password }}'; echo '{{ item.password }}') | smbpasswd {{ item.username }} register: verify_samba_users changed_when: "'New SMB password' in verify_samba_users.stdout" become: true with_items: "{{ samba_users }}" loop_control: label: "{{ item.username }}"
    

0
投票
命令模块不支持流水线。使用 shell 模块来做这样的事情。

参见:

  • 命令模块
  • 外壳模块

-1
投票
使用字典列表的另一种变体:

ad_users: [ { username: john.doe, password: P4ssw0rd*, givenname: John, surname: Doe, mail: john.doe@domain, ou: "OU=Department,OU=Division" }, { username: jane.doe, password: P455w0rd*, givenname: Jane, surname: Doe, mail: jane.doe@domain, ou: "OU=Department,OU=Division" }, ] - name: Add user to AD command: samba-tool user create {{ item.username }} {{ item.password }} --given-name='{{ item.givenname }}' --surname='{{ item.surname }}' --mail-address={{ item.mail }} --userou='{{ item.ou }}' loop: "{{ ad_users }}"
请记住保管敏感数据。

© www.soinside.com 2019 - 2024. All rights reserved.