我正在尝试编写一个脚本(adduser.yml
)来在linux机器中创建用户,该机器从userlist.csv
文件导入用户列表。当我执行adduser.yml时,循环失败只创建第一个用户。有人能帮助我理解我在做什么错误以及如何纠正它吗?
userlist.csv:
id,username,password,sudo
1,ansible1,ansible@123,yes
2,ansible2,ansible@123,no
3,ansible3,ansible@123,yes
4,ansible4,ansible@123,yes
adduser.yml:
---
## executed but until loop failed; check
- hosts: 192.168.0.3
vars:
count: "{{COUNT}}"
x: "1"
uname: "{{ lookup('csvfile', '{{x}} file=userlist.csv delimiter=, col=1') }}"
password: "{{ lookup('csvfile', '{{x}} file=userlist.csv delimiter=, col=2') }}"
sudo: "{{ lookup('csvfile', '{{x}} file=userlist.csv delimiter=, col=3') }}"
tasks:
name: "user add"
action:
- user:
x: "x+=1"
name: "{{ uname }}"
password: "{{ password }}"
state: present
register: x
until: "{{x > count}}"
name: "add to sudoers"
when: sudo == "yes"
lineinfile:
dest: /etc/sudoers
答案 0 :(得分:1)
有些事情不会像你期望的那样有效。首先,你的循环是为你的第一个任务定义的。这意味着只会重复user
任务。 sudo任务和顶部的vars定义都不会被循环。但是不要试图重新定义你的循环,这对vars不起作用。
Ansible没有内置的方法来读取除csv查找之外的csv文件中的变量,这将完全读取一行。但如上所述,你不能将它与循环结合起来。
我看到你有两个选择:
请勿使用csv。 Ansible主要与yaml绑定。如果您对用户有yaml定义,则可以使用include_vars
模块加载这些变量。
如果您使用csv,则可以尝试使用此includecsv module。 (我没有经验,无法判断它是否真的有效)
现在,我们假设您已将用户加载到yaml或csv列表中,并提供了模块。然后你只需循环with_items
:
tasks:
- name: "user add"
user:
name: "{{ item['uname'] }}"
password: "{{ item['password'] }}"
state: present
with_items: users_you_loaded
- name: "add to sudoers"
when: "{{ item['sudo'] }} == 'yes'"
...
with_items: users_you_loaded