Выполнение ad-hoc absible команд
Иногда удобно выполнить одну команду на множестве узлов без создания отдельного ansible playbook’а.
2021-03-12
- Для предотвращения предупреждения о несоответствии ssh-ключей, можно установить переменную:
export ANSIBLE_HOST_KEY_CHECKING=False
или, если не работает, то:export ANSIBLE_SSH_ARGS="-o UserKnownHostsFile=/dev/null"
- Для дебаггинга:
export ANSIBLE_DEBUG=1
- Простейший inventory-файл представляет собой текстовый файл со списком из ip-адресов и/или dns-имён хостов.
- Вместо указания инвентори-файла, можно указать ip-адрес.
Далее примеры:
# Для предотвращения предупреждения о несоответствии ssh-ключей
export ANSIBLE_HOST_KEY_CHECKING=False
# важна запятая после указания одного ip-адреса или dns-имени
ansible all -i 10.1.112.1, -m shell -a 'hostname'
# здесь доп запятая не нужна
ansible all -i 10.1.112.1,prod-airf01p -m shell -a 'hostname'
# выполняем команды с правами root
ansible all -i 10.1.112.1,prod-airf01p -m shell -a 'cat /etc/shadow' --become
# копируем локальный файл в удалённый каталог на все узлы из инвентори-файла
ansible all -i list.hosts -m copy -a 'src=~/soft/nginx.rpm dest=/tmp/'
Я не нашёл способа указать подсеть, вместо одного или нескольких ip-адресов. Пришлось использовать inventory-файл. В простейшем случае собираем инвентори-файл:
# Вся подсеть 10.1.112.0/25
for i in {1..126}; do echo 10.1.112.$i >> hosts.txt; done
# Все узлы с открытым 22-ым портом в подсети 10.1.112.0/25
for i in {1..126}; do nmap -Pn -p22 10.1.112.$i|grep open && echo "10.1.112.$i" >> hosts.txt; done