LINUX.ORG.RU
решено ФорумAdmin

Переменные в ansible, как в bash-scripts

 , , , ,


0

2

Добрый день!
Подскажите можно ли в плэйбуке ansibl'a (или через саму команду ansible «hosts» -m module -a ' ') вставить переменные, как в bash-скрипте?
Допустим, вот кусок из плейбука:

tasks:
    - firewalld:
        rich_rule: 'rule family="ipv4" source address="ip/32" port protocol=«tcp» port=«179» accept'
        zone: public
        permanent: true
        state: enabled
        immediate: yes
Где стоит ip/32 туда и должен встать адрес. Используя обычный скрипт, я бы задал переменную так:
ip=$(awk '/value/ {print $2}' /path/to/file.conf |head -n 1)
Для большего пониманию примерно чтоб было так :)
rich_rule: 'rule family="ipv4" source address="$(awk '/value/ {print $2}' /path/to/file.conf |head -n 1)/32" port protocol=«tcp» port=«179» accept'
Проблема еще в том, что это значение он должен брать именно на удаленной машине, поскольку файл лежит на удаленных машинах с разным везде значением, ну отсюда и нужда забить туда переменную)) Через --extra-vars ничего не вышло, так же пытался указать в самом плейбуке секцию vars. Но может быть как-то не так указывал...


Ответ на: комментарий от alpha

Только с ip-адресами так делать не надо.

ip-адреса ноды уже доступны через стандартные переменные:

ansible_all_ipv4_addresses

ansible_default_ipv4.address

alpha ★★★★★
()
Ответ на: комментарий от alpha

Вот тут собака и зарыта, я не много тупанул(( адрес, который я хотел отобрать это и есть оказывается gateway той машины. Как можно эту переменную теперь вставить? Я попробовал:

rich_rule: 'rule family="ipv4" source address="{{ gateway }} /32" port protocol=«tcp» port=«179» accept'
но получил:
 fatal: [kzl]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'gateway' is undefined\n\nThe error appears to have been in '/etc/ansible/playbooks/optimize.yml': line 3, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n    - firewalld:\n      ^ here\n"}

а насчет регистрации задачи как переменной - большое спасибо, возьму на вооружение.

amkgi
() автор топика
Ответ на: комментарий от amkgi

ты как-то рандомно пытаешься переменные использовать, а они не с потолка все-таки берутся. Надо не догадываться, а искать как соответствующая переменная называется.

ansible при входе на ноду определяет для себя список фактов

полный список можно получить командой

ansible -m setup <hostname>

Там будет простыня переменных которые ansible знает заранее. Среди этой простыни есть например такой кусок:

      "ansible_default_ipv4": {                                                                                      
            "address": "10.0.2.15",                                                                                    
            "alias": "eth0",                                                                                           
            "gateway": "10.0.2.2",                                                                                     
            "interface": "eth0",                                                                                       
            "macaddress": "08:00:27:12:96:98",                                                                         
            "mtu": 1500,                                                                                               
            "netmask": "255.255.255.0",                                                                                
            "network": "10.0.2.0",                                                                                     
            "type": "ether"                                                                                            
        },                               

Соответственно gateway-переменную можно получить из ansible_default_ipv4.gateway

Если же нужного параметра в этой простыне нет - вот тогда надо возиться либо с registered variables, либо с определением параметра на уровне inventory-файла, либо ещё как.

alpha ★★★★★
()
Ответ на: комментарий от alpha

Ну не совсем с потолка, именно так я и взял этот gateway через -m setup, глянув этот кусок.

amkgi
() автор топика
Ответ на: комментарий от alpha

Спасибо большое, выручил))

Перечитал твое сообщение и не заметил оказывается в первый раз эту строчку

Соответственно gateway-переменную можно получить из ansible_default_ipv4.gateway

В писал в плейбук именно так и все готово теперь!)

amkgi
() автор топика
Ответ на: комментарий от alpha

Но последнюю еще спрошу: возможно ли так же использовать встроенные хотя бы переменные, использую просто команду ansible?

amkgi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.