通过ansible创建非交互式samba用户
Non interactive samba user creation via ansible
尽管在 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
它不会产生任何错误,但不会创建用户。
在 Ubuntu 16.0.4.
上与 ansible 2.3.0.0
合作
命令模块不支持流水线。使用 shell 模块来做这样的事情。
参见:
如前所述,管道不适用于命令模块。我过去曾使用类似的方法来创建 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 }}"
如果用户尚不存在,任务只会运行。因此更改密码不适用于此示例。
请使用您的 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,您将以明文形式传递此密码。此外,请注意,这只是需要包含在您的剧本中的一项任务。
另一个使用字典列表的变体:
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 }}"
请记住保管敏感数据。
上面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 }}"
我稍微改进了 siwyd and Tormod Macleod 的代码。
谢谢你们!
- name: shell - create samba users
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
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
变化:
- 添加了 pipefail 以满足 Ansible Lint (https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-shell-pipe)
- 将可执行文件更改为 /bin/bash,因为 /bin/sh 不知道 pipefail
- 已添加 no_log 以防止在任务失败时记录密码
- 删除了 loop_control 标签,因为日志记录被禁用
- 使用循环而不是 with_items
尽管在 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
它不会产生任何错误,但不会创建用户。
在 Ubuntu 16.0.4.
ansible 2.3.0.0
合作
命令模块不支持流水线。使用 shell 模块来做这样的事情。
参见:
如前所述,管道不适用于命令模块。我过去曾使用类似的方法来创建 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 }}"
如果用户尚不存在,任务只会运行。因此更改密码不适用于此示例。
请使用您的 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,您将以明文形式传递此密码。此外,请注意,这只是需要包含在您的剧本中的一项任务。
另一个使用字典列表的变体:
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 }}"
请记住保管敏感数据。
上面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 }}"
我稍微改进了 siwyd and Tormod Macleod 的代码。 谢谢你们!
- name: shell - create samba users
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
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
变化:
- 添加了 pipefail 以满足 Ansible Lint (https://ansible-lint.readthedocs.io/en/latest/default_rules.html#risky-shell-pipe)
- 将可执行文件更改为 /bin/bash,因为 /bin/sh 不知道 pipefail
- 已添加 no_log 以防止在任务失败时记录密码
- 删除了 loop_control 标签,因为日志记录被禁用
- 使用循环而不是 with_items