将变量传递给ansible角色

时间:2017-03-19 07:09:32

标签: 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

当我在角色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

在这种情况下,模板是否适用?从这些SO questions

中找不到多少内容

6 个答案:

答案 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"