Продолжаю мучть ansible. Начало здесь.
Пробовал сегодня делать шаблоны. Пока не всё получается, но всё же опишу то, что удалось сделать.
Во первых, для будущего проекта создам роль, ансибл будет смотреть в директории этой роли. Следуя документации получается следующая иерархия:
Домашняя директория:
ansible# pwd
/etc/ansible
Создаю директорию role:
mkdir roles
cd roles
В ней:
roles]# ls -R
.:
router //пока единственная роль router
./router:
site.yml tasks templates vars
./router/tasks:
main.yml
./router/templates:
hotspot.j2
./router/vars:
site.yml – “главный” файл, отсюда запускаю генератор шаблонов.
[root@localhost router]# cat site.yml
—
– name: Generate configuration files
vars_files: #файлы с переменными
– vars/hotspots
– vars/ap-1
hosts: localhost #где запускаю сценарий
roles: # какие включаю роли.
– router
tasks/main.yml – отсюда запускаю собственно генератор:
[root@localhost router]# cat tasks/main.yml
—
– name: Generate configuration files
template: src=hotspot.j2 dest=/home/tarasko/”{{ hostname }}”.src //Двойные кавычки нужны для экранирования специального символа {
templates/hotspot.j2 – здесь расположен сам шаблон:
cat templates/hotspot.j2
set [ find default-name=wlan1 ] adaptive-noise-immunity=ap-and-client-mode \
band=2ghz-b/g/n channel-width=20/40mhz-Ce country=”united states” \
default-forwarding=no disabled=no distance=indoors frequency={{ freq }} \
frequency-mode=superchannel hw-protection-mode=rts-cts hw-retries=15 mode=\
ap-bridge radio-name=”” scan-list=2400-2500 ssid={{ ssid_name }} tx-power={{ tx_power }} \
tx-power-mode=card-rates wireless-protocol=802.11
/interface bridge
add mtu=1500 name={{ wifi_bridge }} protocol-mode=none
/ip neighbor discovery
set ether1 discover=no
set ether2 discover=no
set ether3 discover=no
set ether4 discover=no
set ether5 discover=no
set wlan1 discover=no
set wifi discover=no
/interface vlan
add interface={{ uplink_interf }} name={{ wifi_vlan_name }} vlan-id={{ wifi_vlan_id }}
add interface={{ uplink_interf }} name={{mgmt_vlan_name}} vlan-id={{ mgmt_vlan_id }}
/ip neighbor discovery
set public_wifi discover=no
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/ip ipsec proposal
set [ find default=yes ] enc-algorithms=3des
/snmp community
set [ find default=yes ] read-access=no
add addresses={{snmp_server_1}},{{snmp_server_2}} name={{ snmp_community }}
/system logging action
set 3 bsd-syslog=yes remote={{ syslog_server }} src-address=10.230.5.14 \
syslog-facility=local3
/interface bridge port
add bridge=wifi interface=public_wifi
add bridge=wifi interface=wlan1
/ip address
add address={{ip_address}}/{{mask}} interface={{ mgmt_vlan_name }} network={{ network }}
/ip route
add distance=1 gateway={{ gateway }}
/ip service
set telnet disabled=yes
set ftp disabled=yes
set www disabled=yes
set ssh address={{ mgmt_address }}
set api disabled=yes
set winbox address={{ mgmt_address }}
/snmp
set enabled=yes location={{hostname}}
/system clock
set time-zone-autodetect=no
/system clock manual
set time-zone={{ time_zone }}
/system identity
set name={{hostname}}
/system logging
add action=remote topics=wireless
/system ntp client
set enabled=yes primary-ntp={{ ntp1 }} secondary-ntp={{ ntp2 }}
В {{}} распологаются переменные.
Переменные определяю в
/etc/ansible/group_vars/hotspots //здесь переменные для группы
/etc/ansible/host_vars/ap-1 //здесь переменные для хоста
Переменные для группы будут перезаписаны одинаковыми переменными для хоста.
cat ap-1
—
hostname: NewStreet_Bar
ip_address: 10.10.5.110
mask: 24
uplink_interf: ether1
[root@localhost router]# cat /etc/ansible/group_vars/hotspots
—
ntp1: 10.10.8.200
ntp2: 10.10.8.201
mgmt_vlan_id: 149
wifi_vlan_id: 170
mgmt_vlan_name: public_wifi_mgmt
wifi_vlan_name: public_wifi
wifi_bridge: wifi
uplink_interf: ether1
ssid_name: Operator_FREE
default_route: 0.0.0.0/0
default_gateway: 10.10.5.1
tx_power: 27
freq: 2422
snmp_community: strongcommunity
snmp_server_1: 10.10.8.2
snmp_server_2: 10.10.8.3
syslog_server: 10.10.8.24
network: 10.10.5.0
mask: 24
gateway: 10.10.5.1
mgmt_address: 10.10.8.0/24
time_zone: +03:00
Запускаю site.yml
[root@localhost router]# ansible-playbook site.yml
PLAY [Generate configuration files] *******************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [router | Generate configuration files] *********************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
Конфиг записывается в соответствующий файл, указанный в таске.
Что сделать дальше:
-научиться делать циклы в шаблоне.
-генерация файлов с переменными в шаблоне с помощью сторонних скриптов, или тем же ансиблом.
-научиться собирать данные из БД.