我有我的目录结构
└── 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
中找不到多少内容
答案 0 :(得分:18)
我通过做
来实现它---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- role: create_new_user
username: username
- role: vimserver
username: username
on 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}}
文件的位置
如果有人对代码感兴趣,
答案 1 :(得分:9)
您应该能够将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
),那么从文档中找到的最简单的选项可能是第三种方式,也就是最复杂的方法。 / p>
对于ansible-examples有一个显着的建议。您可以看到group_vars
目录,其中的文件会根据群组自动为主机提供值,包括魔术all
群组。 group_vars目录可以放在与playbook相同的目录中。
https://github.com/ansible/ansible-examples/tree/master/lamp_simple
答案 2 :(得分:2)
你不能只使用-e参数从命令行传递变量吗?因此,您甚至可以在执行之前指定变量。这也导致最强的变量声明总是占优势(参见Variable precendence)。
如果你想把它放在你的剧本中,我建议用剧本中的set_fact
指令定义用户名。然后,此变量可用于所有角色,也包含在剧本中。类似的东西:
---
- hosts: testdroplets
pre_tasks:
- set_fact:
username: my_username
roles:
- update
- bootstrap_server
- create_new_user
- vimserver
答案 3 :(得分:1)
也许这就是您想要的?
---
- 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
答案 4 :(得分:0)
一切都在这里: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/"
答案 5 :(得分:0)
如果您使用include_role
,则可以像下面那样传递变量。
- hosts: all_hosts
tasks:
- include_role:
name: "path/to/role"
vars:
var1: "var2_value"
var2: "var2_value"