将变量传递给ansible角色

Tas*_*man 21 ansible ansible-template

我有我的目录结构

??? 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
Run Code Online (Sandbox Code Playgroud)

当我在角色下创建用户时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
Run Code Online (Sandbox Code Playgroud)

解决这个问题的一种方法可能是创建一个var/main.yml并将用户名放在那里.但是我想要一些可以指定用户名的东西play.yml.因为我也在角色中使用用户名vimrcserver.

我正在调用角色 play.yml

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver
Run Code Online (Sandbox Code Playgroud)

在这种情况下,模板是否会起作用?从这些SO 问题中找不到多少

Tas*_*man 25

我做了一个工作

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - role: create_new_user
      username: username
    - role: vimserver
      username: username
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

defaults/main.yml在我需要使用的角色里面创建文件的地方{{username}}

如果有人对代码感兴趣,


sou*_*edi 11

你应该能够在play.yml usernamevars输入一个条目.

变量也可以拆分为单独的文件.

这是一个显示两个选项的示例:

- hosts: all
  vars:
    favcolor: blue
  vars_files:
    - /vars/external_vars.yml

  tasks:

  - name: this is just a placeholder
    command: /bin/echo foo
Run Code Online (Sandbox Code Playgroud)

https://docs.ansible.com/ansible/playbooks_variables.html#variable-file-separation

Ansible似乎很高兴有不同的方法来做同样的事情,没有一个很好的综合参考,或理论讨论每种不同方法的全部含义:).如果你不记得以上是可能的(我已经完全忘记了vars_files),从文档中找到的最简单的选项可能是第三种方式,这是最复杂的方法.

对于ansible-examples有一个显着的建议.您可以看到一个group_vars目录,其中的文件会根据其组(包括魔术all组)自动为主机提供值.group_vars目录可以放在与playbook相同的目录中.

https://github.com/ansible/ansible-examples/tree/master/lamp_simple


Lah*_*ima 10

如果您使用include_role,则可以像下面一样传递变量。

- hosts: all_hosts
  tasks:
    - include_role:
        name: "path/to/role"
      vars:
        var1: "var2_value"
        var2: "var2_value"
    
Run Code Online (Sandbox Code Playgroud)


小智 9

也许这就是你想要的?

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - { role: create_new_user, username: 'foobar' }
    - vimserver
Run Code Online (Sandbox Code Playgroud)

https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse_roles.html#using-roles


小智 5

不能只使用 -e 参数从命令行传递变量吗?因此您甚至可以在执行之前指定变量。这也会导致最强的变量声明始终优先(请参阅变量优先级)。

如果您想将其放入剧本中,我建议使用set_fact剧本中的指令定义用户名。然后,该变量可用于所有角色以及包含的剧本。就像是:

---
- hosts: testdroplets
  pre_tasks:
    - set_fact:
        username: my_username
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver
Run Code Online (Sandbox Code Playgroud)