我有我的目录结构
└── digitalocean
├── README.md
├── play.yml
└── roles
├── bootstrap_server
│ └── tasks
│ └── main.yml
├── create_new_user
│ └── tasks
│ └── main.yml
├── update
│ └── tasks
│ └── main.yml
└── vimserver
├── files
│ └── vimrc_server
└── tasks
└── main.yml
当我在角色create_new_user
下创建用户时,我将用户名硬编码为
---
- name: Creating a user named username on the specified web server.
user:
name: username
state: present
shell: /bin/bash
groups: admin
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
- name: Copy .ssh/id_rsa from host box to the remote box for user username
become: true
copy:
src: ~/.ssh/id_rsa.pub
dest: /home/usernmame/.ssh/authorized_keys
mode: 0600
owner: username
group: username
解决这个问题的一种方法可能是创建一个var/main.yml
并将用户名放在那里。但我想通过哪些方法可以在play.yml
级别指定用户名。因为我也在角色vimrcserver
中使用用户名。
我使用play.yml
调用角色
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- create_new_user
- vimserver
我做了一个工作
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- role: create_new_user
username: username
- role: vimserver
username: username
在play.yml
虽然很想看到不同的方法然后这个
文件:http://docs.ansible.com/ansible/playbooks_roles.html#roles
编辑
我终于解决了一个类似的目录结构
$ tree
.
├── README.md
├── ansible.cfg
├── play.yml
└── roles
├── bootstrap_server
│ └── tasks
│ └── main.yml
├── create_new_user
│ ├── defaults
│ │ └── main.yml
│ └── tasks
│ └── main.yml
├── update
│ └── tasks
│ └── main.yml
└── vimserver
├── defaults
│ └── main.yml
├── files
│ └── vimrc_server
└── tasks
└── main.yml
我在角色里面创建一个defaults/main.yml
文件,我需要使用{{username}}
如果有人对代码感兴趣,
您应该能够将username
放入play.yml中的vars
条目中。
变量也可以拆分为单独的文件。
这是一个显示两个选项的示例:
- hosts: all
vars:
favcolor: blue
vars_files:
- /vars/external_vars.yml
tasks:
- name: this is just a placeholder
command: /bin/echo foo
https://docs.ansible.com/ansible/playbooks_variables.html#variable-file-separation
Ansible似乎很高兴有不同的方法来做同样的事情,没有一个很好的综合参考,或理论讨论每种不同方法的全部含义:)。如果你不记得以上是可能的(我完全忘记了vars_files
),从文档中找到的最简单的选项可能是第三种方式,这是最复杂的方法。
对于ansible-examples有一个显着的建议。您可以看到一个group_vars
目录,其中的文件会根据其组自动为主机提供值,包括magic all
组。 group_vars目录可以放在与playbook相同的目录中。
https://github.com/ansible/ansible-examples/tree/master/lamp_simple
也许这就是你想要的?
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- { role: create_new_user, username: 'foobar' }
- vimserver
https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse_roles.html#using-roles
你不能只使用-e参数从命令行传递变量吗?因此,您甚至可以在执行之前指定变量。这也导致最强的变量声明总是占优势(参见Variable precendence)。
如果你想把它放在你的剧本中,我建议用剧本中的set_fact
指令定义用户名。然后,此变量可用于所有角色,也包含在剧本中。就像是:
---
- hosts: testdroplets
pre_tasks:
- set_fact:
username: my_username
roles:
- update
- bootstrap_server
- create_new_user
- vimserver
这一切都在这里:http://docs.ansible.com/ansible/playbooks_variables.html
虽然已经有一些很好的答案,但我想添加我的,因为我已经做了这个确切的事情。
这是我写的角色:https://github.com/jmalacho/ansible-examples/tree/master/roles/users
并且,我使用hash_merge = true和ansible的group_vars来创建用户字典:密钥,组,以便按主机或环境添加新用户,并且重新运行很容易。
我还写了我的团队如何使用组变量为环境:“https://www.coveros.com/ansible-environment-design/”