将变量传递给ansible角色
我的目录结构如下将变量传递给ansible角色,ansible,ansible-template,Ansible,Ansible Template,我的目录结构如下 └── digitalocean ├── README.md ├── play.yml └── roles ├── bootstrap_server │ └── tasks │ └── main.yml ├── create_new_user │ └── tasks │ └── main.yml ├── upda
└── 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
- role: create_new_user
username: username
- role: vimserver
username: username
关于play.yml
虽然我希望看到一个不同的方法,然后这个
文件:
编辑
我最终决定使用如下目录结构
$ 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
在这里,我在需要使用{{username}的角色内创建一个defaults/main.yml文件
如果有人对代码感兴趣
您应该能够在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
Ansible似乎喜欢用不同的方法来做同一件事,既没有很好的综合参考,也没有讨论每种不同方法的全部含义的理由。如果您不记得上面的内容,我可能已经完全忘记了vars_文件,从文档中找到的最简单的方法可能是第三种方法,这是最复杂的方法
这里有一个很好的推荐,推荐一些简单的例子。您可以看到一个group_vars目录,其中包含根据主机组自动为主机提供值的文件,包括magic all组。group_vars目录可以与playbook放在同一个目录中
一切都在这里:
虽然已经有了一些好的答案,但我想添加我的答案,因为我已经做了这件事
以下是我写的角色:
而且,我使用hash_merge=true和ansible的group_vars来创建用户字典:键、组,这样就可以通过主机或环境添加新用户,并可以轻松地重新运行
我还写了我的团队如何在环境中使用组变量,曾经是这样的:您不能用-e参数从命令行传递变量吗?因此,您甚至可以在执行之前指定变量。这也导致了最强大的变量声明,它总是优先于请参见 如果你想把它放在你的剧本中,我建议在剧本中用set_fact指令定义用户名。然后,该变量在所有角色中都可用,也包括剧本。比如:
---
- hosts: testdroplets
pre_tasks:
- set_fact:
username: my_username
roles:
- update
- bootstrap_server
- create_new_user
- vimserver
也许这就是你想要的
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- { role: create_new_user, username: 'foobar' }
- vimserver
如果您使用include_角色,可以像下面这样传递变量
- hosts: all_hosts
tasks:
- include_role:
name: "path/to/role"
vars:
var1: "var2_value"
var2: "var2_value"
“你喜欢这些答案吗?”琼马拉乔夫斯基编辑了我自己的答案。我发现它对于我的用例来说是一个更好的解决方案。谢谢你的精彩回答:也许你可以在你的帖子中加入一个向角色传递变量的例子?上面的链接不再有效。它被移到了这里:
- hosts: all_hosts
tasks:
- include_role:
name: "path/to/role"
vars:
var1: "var2_value"
var2: "var2_value"