31

我的目录结构是这样的

└── 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 问题中找不到太多信息

4

6 回答 6

42

我做了一个

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

如果有人对代码感兴趣,

于 2017-03-19T07:55:38.827 回答
15

您应该可以在 play.ymlusername中输入一个条目。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目录,其中包含根据主机组(包括魔术all组)自动为主机提供值的文件。group_vars 目录可以与 playbook 放在同一目录中。

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

于 2017-03-19T15:01:51.660 回答
10

也许这就是你想要的?

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

于 2018-07-16T11:41:26.900 回答
4

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

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

---
- hosts: testdroplets
  pre_tasks:
    - set_fact:
        username: my_username
  roles:
    - update
    - bootstrap_server
    - create_new_user
    - vimserver
于 2017-03-20T10:01:57.163 回答
1

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

- hosts: all_hosts
  tasks:
    - include_role:
        name: "path/to/role"
      vars:
        var1: "var2_value"
        var2: "var2_value"
    
于 2020-09-09T04:49:17.387 回答
-2

都在这里: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/

于 2017-03-19T20:01:49.323 回答