У меня есть много сборников пьес Ansible, которые будут включены в гораздо более крупные сборники. Например:
---
- name: Add user me
user: name=me comment="Me" uid=9999 groups=somegroup
- name: Add my ssh public key
authorized_key: user=me key="{{ lookup('file', 'id_rsa.pub') }}"
Есть ли способ передать имя хоста и запустить его как отдельную задачу из командной строки, или мне нужно создать другую книгу для выполнения этих двух задач отдельно?
Для этого есть два требования:
вам нужно пометить задачи в роли, которую вы хотите запустить
- name: Add user me
user: name=me comment="Me" uid=9999 groups=somegroup
tags: this_role
- name: Add my ssh public key
authorized_key: user=me key="{{ lookup('file', 'id_rsa.pub') }}"
tags: this_role
Тогда ты можешь:-
ansible-playbook foo.yml -i hosts -t this_role --limit host.example.com
Не то чтобы при этом все еще выполняется playbook, который содержит полную игру, но он ограничивает выполняемые задачи только теми, которые соответствуют тегу. Остальные задачи будут пропущены.
Обе пользователь и авторизованный_key являются модулями. Так что вы можете вызвать их с помощью ansible -m
из любого сценария
ansible all -i host.example.com, -m user -a 'name=me comment="Me" uid=9999 groups=somegroup'
ansible all -i host.example.com, -m authorized_key -a "user=me key=\"{{ lookup('file', 'id_rsa.pub') }}\""
Обратите внимание на конечную запятую после имени хоста.
Конечно, вы должны уметь делать что-то вроде:
$ ansible-playbook foo.yml -i hosts -u user --limit host.example.com
Я тоже столкнулся с этой проблемой.
Я решил проблему, создав небольшой сборник игр для бегунов, который затем вызываю с параметром.
> tree
.
├── ansible.cfg
├── inventory
├── taskrunner.yml
├── tasks
└── hello.yml
> cat taskrunner.yml:
---
- hosts: all
tasks:
- name: "Runner will try to run task: {{ task }}"
include: "{{ task }}"
> cat tasks/hello
- name: print hello
shell: echo hello world
> ansible-playbook taskrunner.yml -e task=tasks/hello.yml