Передача переменных в исполняемые роли

У меня есть структура моего каталога, как это

└── 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 вопросов

Ответ 1

Я получил это, сделав

---
- 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 файл defaults/main.yml внутри ролей, где мне нужно использовать {{username}}

Если кто-то заинтересован в коде,

Ответ 2

Вы можете поместить username в запись vars в play.yml.

Переменные также можно разделить на отдельные файлы.

Вот пример, который показывает обе опции:

- 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), самый простой вариант, который можно найти в документации, возможно, был третьим способом, который является самым сложным.

Там видная рекомендация для примеров-примеров. Вы можете увидеть каталог group_vars с файлами, которые автоматически предоставляют значения для хостов в соответствии с их группами, включая магическую группу all. Каталог group_vars можно поместить в тот же каталог, что и в учебнике.

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

Ответ 3

Вы не можете просто передать переменную из командной строки с параметром -e? Таким образом, вы можете указать переменную еще до выполнения. Это также приводит к объявлению самой сильной переменной, которая всегда имеет приоритет (см. Приоритет переменной).

Если вы хотите поместить его в вашу книгу, я предлагаю определить имя пользователя с set_fact директивы set_fact в set_fact. Затем эта переменная доступна во всех ролях, а также в сборниках игр. Что-то вроде:

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

Ответ 4

Здесь все: 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/"