将变量传递给Ansible角色

43

我的目录结构如下

.
├── 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

在这种情况下,模板是否适用?
从其他问题中找不到太多信息:

6个回答

57

我通过使用这个playbook使它工作了:

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

文档: http://docs.ansible.com/ansible/playbooks_roles.html#roles


这里是另一种选择,使用类似于目录结构的方式

.
├── 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}}的角色内部。

如果有人对代码感兴趣:https://github.com/tasdikrahman/ansible-bootstrap-server


15

您应该能够在play.yml中的vars条目中输入username

变量也可以拆分成单独的文件。

以下示例显示了两个选项:

- 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目录,其中包含文件,根据它们的组自动为主机提供值,包括神奇的all组。 group_vars目录可以放置在与playbook相同的目录中。

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


14

9

如果您使用include_role,可以按照以下方式传递变量。

- hosts: all_hosts
  tasks:
    - include_role:
        name: "path/to/role"
      vars:
        var1: "var2_value"
        var2: "var2_value"
    

最佳答案。它是能够给你完全控制和更多灵活性的选项。 - Richard Gomes
请注意:当在vars块内使用default(omit)时,它的作用并不如预期。它不会跳过那一行,而是将省略占位符字符串传递给导入的角色。为了解决这个问题,在包含角色之前,您可以使用set_facts设置角色变量。 - Florin Hillebrand
返回“未找到预期的'-'指示符”消息,指向vars:运算符。 - Gergely Lukacsy

5
你能否使用-e参数从命令行传递变量?这样你可以在执行之前指定变量。这也会导致最强的变量声明总是优先(请参阅变量优先级)。
如果你想将其放置在playbook内部,我建议在playbook中使用set_fact指令定义用户名。这个变量在所有角色和包括的playbooks中都可用。像这样:
---
- hosts: testdroplets
  pre_tasks:
    - set_fact:
        username: my_username
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver

-3

这里有全部内容: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/"


9
也许您可以在您的帖子中包含一个传递变量到角色的示例? - mdornfe1
上面的链接已经失效了。它已经被移动到这里:https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html - Kreempuff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接