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

Ansible - не работает conditional для local facts

 ,


0

1

Есть local fact, который выдаёт следующие значения:

ansible gw79 -m setup -a "filter=ansible_local"
gw79 | success >> {
    "ansible_facts": {
        "ansible_local": {
            "ipmi": {
                "lan_1": {
                    "AuthTypeEnable": "Callback:MD2MD5PASSWORD", 
                    "AuthTypeSupport": "NONEMD2MD5PASSWORD", 
                    "BMCARPControl": "ARPResponsesEnabled,GratuitousARPDisabled", 
                    "BackupGatewayIP": "0.0.0.0", 
                    "BackupGatewayMAC": "00:00:00:00:00:00", 
                    "CipherSuitePrivMax": "aaaaXXaaaXXaaXX", 
                    "DefaultGatewayIP": "0.0.0.0", 
                    "DefaultGatewayMAC": "00:00:00:00:00:00", 
                    "IPAddress": "10.10.10.100", 
                    "IPAddressSource": "StaticAddress", 
                    "IPHeader": "TTL=0x00Flags=0x00Precedence=0x00TOS=0x00", 
                    "MACAddress": "00:25:90:9e:ca:c7", 
                    "RMCP+CipherSuites": "1,2,3,6,7,8,11,12", 
                    "SNMPCommunityString": "public", 
                    "SetinProgress": "SetComplete", 
                    "SubnetMask": "255.255.255.0", 
                    "qVLANID": "7", 
                    "qVLANPriority": "0"
                }
            }
        }
    }, 
    "changed": false
}

Задачи из роли:

- name: set ipmi vlan
  command: ipmitool lan set 1 vlan id "{{ ipmi.vlan }}"
  when: ansible_local.ipmi.lan_1.qVLANID != ipmi.vlan
- name: set ipmi address
  command: ipmitool lan set 1 ipaddr "{{ ipmi.address }}"
  when: ansible_local.ipmi.lan_1.IPAddress != ipmi.address
- name: set ipmi netmask
  command: ipmitool lan set 1 netmask "{{ ipmi.netmask }}"
  when: ansible_local.ipmi.lan_1.SubnetMask != ipmi.netmask
- name: set ipmi gateway
  command: ipmitool lan set 1 defgw ipaddr "{{ ipmi.gw }}"
  when: ansible_local.ipmi.lan_1.DefaultGatewayIP != ipmi.gw

- name: debug
  debug: msg="{{ ansible_local.ipmi.lan_1.qVLANID }}"_"{{ ipmi.vlan }}"_"{{ ansible_local.ipmi.lan_1.IPAddress }}"_"{{ ipmi.address }}"_"{{ ansible_local.ipmi.lan_1.SubnetMask }}"_"{{ ipmi.netmask }}"_"{{ ansible_local.ipmi.lan_1.DefaultGatewayIP }}"_"{{ ipmi.gw }}"

Вывод ansible-playbook:

ansible-playbook playbook/site.yml --tags ipmi  

PLAY [gw-region] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [gw79]

TASK: [ipmi | set ipmi vlan] ************************************************** 
changed: [gw79]

TASK: [ipmi | set ipmi address] *********************************************** 
changed: [gw79]

TASK: [ipmi | set ipmi netmask] *********************************************** 
skipping: [gw79]

TASK: [ipmi | set ipmi gateway] *********************************************** 
skipping: [gw79]

TASK: [ipmi | debug] ********************************************************** 
ok: [gw79] => {
    "item": "", 
    "msg": "7_7_10.10.10.100_10.10.10.100_255.255.255.0_255.255.255.0_0.0.0.0_0.0.0.0"
}

PLAY RECAP ******************************************************************** 
gw79                       : ok=4    changed=2    unreachable=0    failed=0   

То есть для двух заданий - netmask и gateway - conditional работает как надо, а для других двух - не работает, и они выполняются всегда. Хотя из вывода debug явно видно, что значения одинаковые.

Где я не прав?

Традиционно, sudo cast val-amart

З.Ы. А можно ли как-нибудь запихивать на хост local fact, а только потом делать GATHERING FACTS? Или хотя бы принудительно их получение перезапускать?

★★★

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

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

Да. Причём с другими двумя всё ОК. Дебаг до тасков сделал, то же самое. -v добавлять не помогает, ничего интересного не выводит. Да и просто если ansible -m setup -a «filter=ansible_local» посмотреть, видно, что все значения уже установлены. Единственное, что сейчас пришло в голову, оба проблемных значения с маленькой буквы начинаются, может как-то с регистром поиграться?

selivan ★★★
() автор топика
Последнее исправление: selivan (всего исправлений: 1)
Ответ на: комментарий от selivan

Сделал всё lower-case, не помогло: так же vlan и address всегда отраюатывают, а netmask и gateway скипаются, как положено. Непонятно.

selivan ★★★
() автор топика
Ответ на: комментарий от val-amart

Уже лучше. Когда в переменных сделал

ipmi:
  vlan: "2"
секция с vlan тоже стала отрабатывать как надо. ip-адрес пока побороть не получается: в переменных он уже задан как
address: 192.168."{{ number }}".100
, и всё равно секция с ip-адресом всегда отрабатывает :( Какой-то крайне загадочный type mismatch.

Изменил сравнение на такое - всё равно не помогает:

when: ansible_local.ipmi.lan_1.ipaddress ~ ' ' != ipmi.address ~ ' '

selivan ★★★
() автор топика
Последнее исправление: selivan (всего исправлений: 2)
Ответ на: комментарий от selivan
when: ansible_local.ipmi.lan_1.ipaddress|string != ipmi.address|string

так тоже не помогает :(

selivan ★★★
() автор топика
Ответ на: комментарий от val-amart

Всё, совсем победил: address был задан как 192.168."{{ number }}".100, при этом кавычки в строке оставались, но на консоль не выводились. Как-то всё оно неочевидно. В том же файле host_vars, Если написать net_number: {{ number }} без кавычек, будет ругаться на неправильный синтаксис.

selivan ★★★
() автор топика
Последнее исправление: selivan (всего исправлений: 1)
Ответ на: комментарий от val-amart

З.Ы. Если добавил руками кастомный факт, перечитать модно так:

- name: re-read facts after adding custom fact
  setup: filter=ansible_local

selivan ★★★
() автор топика
Последнее исправление: selivan (всего исправлений: 1)
Ответ на: комментарий от selivan

аа, ясно. я сначала подумал на type mismatch.

а невидно оно потому что там str() а не repr(). было бы здорово иметь дебаг который бы показывал репр. пошлю-ка фич реквест.

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

Показывает, если задавать не «debug msg=», а «debug var=». Так я его и поймал. Ну и собственно сабж, вдруг кому пригодится: https://github.com/selivan/ansible_ipmi_lan_manage

selivan ★★★
() автор топика
Последнее исправление: selivan (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.