我对 ansible 还比较陌生,正在尝试编写一个剧本,根据 user_type(我正在尝试定义)将用户添加到一组服务器中...
所以...我的剧本看起来有点像这样......
- name: add user
user:
name={{ item }}
state=present
shell=/bin/bash
with_items: "{{ userlist }}"
tags: add_new_user
become: true
userlist
在单独的 yml 文件中定义:
---
userlist:
user1
user2
user3
在我的 hosts 文件中定义有 3 个组:
[grp1]
192.168.0.0
192.168.0.1
[grp2]
192.168.0.0
192.168.0.3
[grp3]
192.168.0.4
我正在考虑将这些 grp 类型添加到我的用户列表中,因此它看起来有点像这样:
---
userlist:
user1 grp1
user2 grp2
user3 grp3
我正在尝试弄清楚我的剧本究竟如何确定哪些用户被添加到哪些服务器 - 我知道我需要声明另一个变量以便我的剧本知道用户 1 被添加到 grp1 中的服务器,但我不知道如何做?
答案1
一个简单的方法:使用组变量:
如果每个服务器只有一个用户,则可以在库存中定义它们(您需要调整您的游戏以不循环并使用newuser
var 代替):
[grp1:vars]
newuser=user1
如果有更多用户,则需要 YAML 清单(而不是 ini)或使用组 var 文件:group_vars
在包含清单文件的目录下创建一个名为的子目录,每个组一个文件,例如
$ cat grp1
userlist:
- user1
- user2
然后userlist
针对每个组分别定义。
答案2
最简单的方法是通过主机变量或主机组变量。你可以在这里了解如何操作ansible 手册。另一个更高级的选项是通过自定义事实或脚本。您需要阅读有关变量排序的内容以避免意外行为。
另外,我想指出一些小的语法错误。你不能用 accolade({) 来开始声明。每行放置单个声明时请使用冒号。像这样:
库存文件:
[grp1]
host1
host2
host3
[grp2]
host4
host5
host6
[grp3]
host1
host4
剧本.yml:
- hosts: all
become: true
tasks:
- name: adding users to x
user:
name: "{{ item }} "
state: present
shell: /bin/bash
with_items: "{{ userlist }}"
tags: add_new_user
组变量/grp1.yml:
---
userlist:
- user1
- user2
- user3
host_vars/host5.yml
---
userlist:
- user1
- user4
- user10