Выполнение 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.15.112.1, -m shell -a 'hostname'

# здесь доп запятая не нужна
ansible all -i 10.15.112.1,prod-airf01p -m shell -a 'hostname'

# выполняем команды с правами root
ansible all -i 10.15.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.15.112.0/25
for i in {1..126}; do echo 10.15.112.$i >> hosts.txt; done

# Все узлы с открытым 22-ым портом в подсети 10.15.112.0/25
for i in {1..126}; do nmap -Pn -p22 10.15.112.$i|grep open && echo "10.15.112.$i" >> hosts.txt; done