带循环的ansible寄存器

时间:2019-07-08 11:08:01

标签: loops ansible

我想创建用户并将其信息收集到本地文件中,但是使用循环寄存器现在可以按预期工作。

我认为这是一个缩进问题,但是没有运气。

我的剧本

---
- hosts: localhost
  tasks:
    - name: Clearing Local file 
      local_action: shell echo "Zone,docode,doname,testuser Output" > user.csv



- hosts: app
  tasks:

    - name: Creating user Testuser
      become: yes 
      user: 
        name: "{{ item }}" 
        state: present 
        shell: "/bin/bash"
        password: "$6$mysecretsalt$qyctTVhRMS1ZSnCuzQNAM8Y7V/yqSEnyRbal0IYXSqSEVKkXF8ZmXBZoRIaN/PvzE/msq8iOJO830OOCG89va/"  
        update_password: always 
        groups: santosh 

      shell: id "{{item}}"   
      ragister: userout  

      loop: 
        - newuser1
        - newuser2
        - newuser3

    - debug: 
        var=userout

在执行时会出现以下错误

ERROR! conflicting action statements: shell, user

The error appears to have been in '/home/santosh/ans-home/playbooks/Create_User_and_Gather_output.yml': line 12, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


    - name: Creating user Testuser
      ^ here

1 个答案:

答案 0 :(得分:1)

您不能在一个任务中调用多个模块,需要根据错误消息的报告将每个调用分开在自己的任务中。

我了解您为什么尝试这样做:利用同一循环执行多项任务。不幸的是,这是不可能的。如果确实需要遍历大量任务,则可以将一组任务移到一个单独的文件中并将其包含在循环中。在您的情况下,实际上并不需要这样做,因为:

  • 您只有两项任务
  • 您可以使用已声明的var进行重用,从而紧凑地编写循环
  • 最主要是因为您不需要第二项任务

实际上,用户模块将返回其创建的用户uid或存在于其结果中的用户的uid。您只需要注册调用user模块的结果即可。

第二步就尝试以下内容:

- name: Resgister application users
  hosts: app

  vars:
    user_list:
      - newuser1
      - newuser2
      - newuser3

  tasks:
    - name: Create the users if they don't exist
      user:
        name: "{{ item }}" 
        state: present 
        shell: "/bin/bash"
        password: "$6$mysecretsalt$qyctTVhRMS1ZSnCuzQNAM8Y7V/yqSEnyRbal0IYXSqSEVKkXF8ZmXBZoRIaN/PvzE/msq8iOJO830OOCG89va/"  
        update_password: always 
        groups: santosh
      register: create_users
      loop: "{{ user_list }}"

    - name: Show ids of users
      debug:
        msg: "The uid of user {{ item.name }} is: {{ item.uid }}"
      loop: "{{ create_users.results }}"

此外,请注意:在您的第一个游戏中,请帮自己一个忙,并停止使用旧的local_action语法来支持delegate_to: localhost来完成一项任务。在您的情况下甚至不需要,因为您已经将播放仅定位到本地主机。