- Установите ansible версии 2.10 или выше.
Решение
[frolls@mainframe playbook]$ ansible --version
ansible [core 2.13.1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/frolls/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.10/site-packages/ansible
ansible collection location = /home/frolls/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.5 (main, Jun 6 2022, 18:49:26) [GCC 12.1.0]
jinja version = 3.1.2
libyaml = True
- Попробуйте запустить playbook на окружении из
test.yml
, зафиксируйте какое значение имеет фактsome_fact
для указанного хоста при выполнении playbook'a. - Найдите файл с переменными (group_vars) в котором задаётся найденное в первом пункте значение и поменяйте его на 'all default fact'.
- Воспользуйтесь подготовленным (используется
docker
) или создайте собственное окружение для проведения дальнейших испытаний. - Проведите запуск playbook на окружении из
prod.yml
. Зафиксируйте полученные значенияsome_fact
для каждого изmanaged host
. - Добавьте факты в
group_vars
каждой из групп хостов так, чтобы дляsome_fact
получились следующие значения: дляdeb
- 'deb default fact', дляel
- 'el default fact'. - Повторите запуск playbook на окружении
prod.yml
. Убедитесь, что выдаются корректные значения для всех хостов. - При помощи
ansible-vault
зашифруйте факты вgroup_vars/deb
иgroup_vars/el
с паролемnetology
. - Запустите playbook на окружении
prod.yml
. При запускеansible
должен запросить у вас пароль. Убедитесь в работоспособности. - Посмотрите при помощи
ansible-doc
список плагинов для подключения. Выберите подходящий для работы наcontrol node
. - В
prod.yml
добавьте новую группу хостов с именемlocal
, в ней разместите localhost с необходимым типом подключения. - Запустите playbook на окружении
prod.yml
. При запускеansible
должен запросить у вас пароль. Убедитесь что фактыsome_fact
для каждого из хостов определены из верныхgroup_vars
. - Заполните
README.md
ответами на вопросы. Сделайтеgit push
в веткуmaster
. В ответе отправьте ссылку на ваш открытый репозиторий с изменённымplaybook
и заполненнымREADME.md
.
Решение
1. Попробуйте запустить playbook на окружении из test.yml
, зафиксируйте какое значение имеет факт some_fact
для указанного хоста при выполнении playbook'a.
[frolls@mainframe playbook]$ ansible-playbook site.yml -i inventory/test.yml
PLAY [Print os facts] ******************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
[WARNING]: Platform linux on host localhost is using the discovered Python interpreter at /usr/bin/python3.10, but future installation of another
Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-
core/2.13/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]
TASK [Print OS] ************************************************************************************************************************************
ok: [localhost] => {
"msg": "Archlinux"
}
TASK [Print fact] **********************************************************************************************************************************
ok: [localhost] => {
"msg": 12
}
PLAY RECAP *****************************************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2. Найдите файл с переменными (group_vars) в котором задаётся найденное в первом пункте значение и поменяйте его на 'all default fact'.
PASSED:
[frolls@mainframe playbook]$ ansible-playbook site.yml -i inventory/test.yml
PLAY [Print os facts] ******************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
[WARNING]: Platform linux on host localhost is using the discovered Python interpreter at /usr/bin/python3.10, but future installation of another
Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-
core/2.13/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]
TASK [Print OS] ************************************************************************************************************************************
ok: [localhost] => {
"msg": "Archlinux"
}
TASK [Print fact] **********************************************************************************************************************************
ok: [localhost] => {
"msg": "all default fact"
}
PLAY RECAP *****************************************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3. Воспользуйтесь подготовленным (используется docker
) или создайте собственное окружение для проведения дальнейших испытаний.
ссылка на docker-compose манифест
MISSION COMPLETE:
[frolls@mainframe playbook]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a5f4666b817 centos:7 "sleep infinity" 30 seconds ago Up 28 seconds centos7
60dad988683f docker_ubuntu "sleep infinity" 30 seconds ago Up 28 seconds ubuntu
4. Проведите запуск playbook на окружении из prod.yml
. Зафиксируйте полученные значения some_fact
для каждого из managed host
.
Вот оно:
[frolls@mainframe playbook]$ ansible-playbook site.yml -i inventory/prod.yml
PLAY [Print os facts] *******************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [ubuntu]
ok: [centos7]
TASK [Print OS] *************************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "CentOS"
}
ok: [ubuntu] => {
"msg": "Ubuntu"
}
TASK [Print fact] ***********************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "el"
}
ok: [ubuntu] => {
"msg": "deb"
}
PLAY RECAP ******************************************************************************************************************************************************************************************
centos7 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
5. Добавьте факты в group_vars
каждой из групп хостов так, чтобы для some_fact
получились следующие значения: для deb
- 'deb default fact', для el
- 'el default fact'.
Сделал!
6. Повторите запуск playbook на окружении prod.yml
. Убедитесь, что выдаются корректные значения для всех хостов.
[frolls@mainframe playbook]$ ansible-playbook site.yml -i inventory/prod.yml
PLAY [Print os facts] *******************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [ubuntu]
ok: [centos7]
TASK [Print OS] *************************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "CentOS"
}
ok: [ubuntu] => {
"msg": "Ubuntu"
}
TASK [Print fact] ***********************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "el default fact"
}
ok: [ubuntu] => {
"msg": "deb default fact"
}
PLAY RECAP ******************************************************************************************************************************************************************************************
centos7 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
7. При помощи ansible-vault
зашифруйте факты в group_vars/deb
и group_vars/el
с паролем netology
.
Выполнил ansible-vault create group_vars/deb
и ansible-vault create group_vars/el
. Выхлоп:
[frolls@mainframe playbook]$ cat group_vars/deb/tmpfhkk148j
$ANSIBLE_VAULT;1.1;AES256
63623337613537363066323530653463316466656538346136376565376637306266636661623438
3666396432633261653130363163643834666638626136320a373364353162366438333632363038
61626263316538623438396239396239343865396366653737613532636339663165306432373361
6237383465613264390a613933613565383730393138346663636263663731353463613865386562
3161
[frolls@mainframe playbook]$ cat group_vars/el/tmpv0wwpxg2
$ANSIBLE_VAULT;1.1;AES256
31646337353335353861623230623466666464303732343633623432636566633162383466356332
6562333266643265333335353433666566326633646539650a353366306364643465343336333634
66613135616266306431366234663865636462353331613235346562326662303637393762313233
3234353266313433300a613035383635343634393831636131373035666432303430333638343731
6562
8. Запустите playbook на окружении prod.yml
. При запуске ansible
должен запросить у вас пароль. Убедитесь в работоспособности.
Получилось!
[frolls@mainframe playbook]$ ansible-playbook site.yml -i inventory/prod.yml --ask-vault-pass
Vault password:
PLAY [Print os facts] *******************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [ubuntu]
ok: [centos7]
TASK [Print OS] *************************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "CentOS"
}
ok: [ubuntu] => {
"msg": "Ubuntu"
}
TASK [Print fact] ***********************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "el default fact"
}
ok: [ubuntu] => {
"msg": "deb default fact"
}
PLAY RECAP ******************************************************************************************************************************************************************************************
centos7 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
9. Посмотрите при помощи ansible-doc
список плагинов для подключения. Выберите подходящий для работы на control node
.
Вывод ansible-doc -t connection -l
выдал длинный список:
[frolls@mainframe playbook]$ ansible-doc -t connection -l
ansible.netcommon.httpapi Use httpapi to run command on network appliances
ansible.netcommon.libssh (Tech preview) Run tasks using libssh for ssh connection
ansible.netcommon.napalm Provides persistent connection using NAPALM
ansible.netcommon.netconf Provides a persistent connection using the netconf protocol
ansible.netcommon.network_cli Use network_cli to run command on network appliances
ansible.netcommon.persistent Use a persistent unix socket for connection
community.aws.aws_ssm execute via AWS Systems Manager
community.docker.docker Run tasks in docker containers
community.docker.docker_api Run tasks in docker containers
community.docker.nsenter execute on host running controller container
community.general.chroot Interact with local chroot
community.general.funcd Use funcd to connect to target
community.general.iocage Run tasks in iocage jails
community.general.jail Run tasks in jails
community.general.lxc Run tasks in lxc containers via lxc python library
community.general.lxd Run tasks in lxc containers via lxc CLI
community.general.qubes Interact with an existing QubesOS AppVM
community.general.saltstack Allow ansible to piggyback on salt minions
community.general.zone Run tasks in a zone instance
community.libvirt.libvirt_lxc Run tasks in lxc containers via libvirt
community.libvirt.libvirt_qemu Run tasks on libvirt/qemu virtual machines
community.okd.oc Execute tasks in pods running on OpenShift
community.vmware.vmware_tools Execute tasks inside a VM via VMware Tools
community.zabbix.httpapi Use httpapi to run command on network appliances
containers.podman.buildah Interact with an existing buildah container
containers.podman.podman Interact with an existing podman container
kubernetes.core.kubectl Execute tasks in pods running on Kubernetes
local execute on controller
paramiko_ssh Run tasks via python ssh (paramiko)
psrp Run tasks over Microsoft PowerShell Remoting Protocol
ssh connect via SSH client binary
winrm Run tasks over Microsoft's WinRM
Для подключения в качестве выбрал плагин local
.
10. В prod.yml
добавьте новую группу хостов с именем local
, в ней разместите localhost с необходимым типом подключения.
Получилось как-то так:
---
el:
hosts:
centos7:
ansible_connection: docker
deb:
hosts:
ubuntu:
ansible_connection: docker
local:
hosts:
localhost:
ansible_connection: local
11. Запустите playbook на окружении prod.yml
. При запуске ansible
должен запросить у вас пароль. Убедитесь что факты some_fact
для каждого из хостов определены из верных group_vars
.
В принципе, совпадает с реальностью:
[frolls@mainframe playbook]$ ansible-playbook site.yml -i inventory/prod.yml --ask-vault-pass
Vault password:
PLAY [Print os facts] *******************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
[WARNING]: Platform linux on host localhost is using the discovered Python interpreter at /usr/bin/python3.10, but future installation of another Python interpreter could change the meaning of
that path. See https://docs.ansible.com/ansible-core/2.13/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]
ok: [ubuntu]
ok: [centos7]
TASK [Print OS] *************************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "CentOS"
}
ok: [ubuntu] => {
"msg": "Ubuntu"
}
ok: [localhost] => {
"msg": "Archlinux"
}
TASK [Print fact] ***********************************************************************************************************************************************************************************
ok: [centos7] => {
"msg": "el default fact"
}
ok: [localhost] => {
"msg": "all default fact"
}
ok: [ubuntu] => {
"msg": "deb default fact"
}
PLAY RECAP ******************************************************************************************************************************************************************************************
centos7 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- При помощи
ansible-vault
расшифруйте все зашифрованные файлы с переменными.
[frolls@mainframe playbook]$ ansible-vault decrypt group_vars/deb/tmpfhkk148j
Vault password:
Decryption successful
[frolls@mainframe playbook]$ ansible-vault decrypt group_vars/el/tmpv0wwpxg2
Vault password:
Decryption successful