Ansible脚本正在执行但循环失败

时间:2016-02-04 08:49:08

标签: ansible ansible-playbook

我正在尝试编写一个脚本(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

1 个答案:

答案 0 :(得分:1)

有些事情不会像你期望的那样有效。首先,你的循环是为你的第一个任务定义的。这意味着只会重复user任务。 sudo任务和顶部的vars定义都不会被循环。但是不要试图重新定义你的循环,这对vars不起作用。

Ansible没有内置的方法来读取除csv查找之外的csv文件中的变量,这将完全读取一行。但如上所述,你不能将它与循环结合起来。

我看到你有两个选择:

  1. 请勿使用csv。 Ansible主要与yaml绑定。如果您对用户有yaml定义,则可以使用include_vars模块加载这些变量。

  2. 如果您使用csv,则可以尝试使用此includecsv module。 (我没有经验,无法判断它是否真的有效)

  3. 现在,我们假设您已将用户加载到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