将变量传递给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"