Передача переменных в исполняемые роли
У меня есть структура моего каталога, как это
└── 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/"
Ответ 5
Может быть, это то, что вы хотите?
---
- 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