在Ansible条件语句中引用当前变量

64次阅读
没有评论

问题描述

正在使用Ansible Galaxy上的willshersystems.users角色,在Ubuntu服务器上创建用户。现在他已经成功使其正常工作,但他想根据用户是否应该访问特定服务器(根据给定的列表)来设置state属性。他尝试了类似下面的方法,但似乎出现了问题。他希望能得到一些建议。

vars:
  user_servers:
    user1:
      - testing1
users:
  - name: user1
    groups: '{{ user_groups }}'
    state: "{{ ( inventory_hostname_short in user_servers[self.name] ) | ternary('present','absent') }}"
roles:
  - role: willshersystems.users

解决方案

请注意以下操作注意版本差异及修改前做好备份。

在Ansible中,条件语句的处理需要一些注意事项。您尝试的方法是正确的方向,但是需要一些调整。以下是您可以尝试的修正后的方法:

---
- name: Configure Users
  hosts: all
  vars:
    user_servers:
      user1:
        - testing1
  tasks:
    - name: Filter users
      set_fact:
        filtered_users: "{{ users | default([]) | selectattr('name', 'in', user_servers[self.name]) | list }}"
      when: user_servers[self.name] is defined

    - name: Add filtered users
      include_role:
        name: willshersystems.users
      loop: "{{ filtered_users }}"
      loop_control:
        loop_var: user_item

在上面的示例中,我们做了以下修改:
1. 使用set_fact任务来过滤用户列表并将其存储在filtered_users变量中,这样您就可以在后面的步骤中使用它。
2. 使用selectattr过滤器来检查users列表中的用户名是否在user_servers中,如果是,则将其添加到filtered_users列表中。
3. 使用when语句来检查是否定义了当前用户在user_servers中,以避免不必要的操作。

请注意,这只是一个示例,您可能需要根据实际情况进行一些微调。另外,确保您的Ansible版本支持所使用的语法和功能。

总结

在Ansible中,根据条件来设置属性需要注意条件语句的语法和处理方法。通过使用适当的任务和过滤器,您可以实现根据特定条件动态设置属性的目标。在编写Ansible任务时,始终确保您理解任务的执行顺序以及如何正确处理变量和条件语句。

正文完