将变量传递给ansible角色

问题描述 投票:14回答:5

我有我的目录结构

└── 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找不到多少

ansible ansible-template
5个回答
19
投票

我做了一个工作

---
- hosts: testdroplets
  roles:
    - update
    - bootstrap_server
    - role: create_new_user
      username: username
    - role: vimserver
      username: username

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}}

如果有人对代码感兴趣,


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),从文档中找到的最简单的选项可能是第三种方式,这是最复杂的方法。

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

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


2
投票

也许这就是你想要的?

---
- 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


2
投票

你不能只使用-e参数从命令行传递变量吗?因此,您甚至可以在执行之前指定变量。这也导致最强的变量声明总是占优势(参见Variable precendence)。

如果你想把它放在你的剧本中,我建议用剧本中的set_fact指令定义用户名。然后,此变量可用于所有角色,也包含在剧本中。就像是:

---
- hosts: testdroplets
  pre_tasks:
    - set_fact:
        username: my_username
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver

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/

© www.soinside.com 2019 - 2024. All rights reserved.