问题描述
正在使用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任务时,始终确保您理解任务的执行顺序以及如何正确处理变量和条件语句。
正文完