Ansible - развертывание на одном хосте с использованием нескольких значений для одной и той же переменной - PullRequest
0 голосов
/ 24 апреля 2020

Ansible версия: 2.4.2.0

Я использую каталог в качестве инвентаря, в котором есть 2 файла - a, b

Файл a
[frontend] hostname001 [frontend:vars] envt=frontend

Файл b
[backend] hostname001 [backend:vars] envt=backend

Значение переменной переопределяется и сохраняется только внутренний интерфейс.

Пример Playbook
- name: Sample play hosts: '{{ group }}' connection: local tasks: - name: "Do a demo" debug: msg: 'The envt is {{envt}}'

Когда я пытаюсь развернуть фронтенд, передавая group = frontend в качестве extravar, вывод выглядит следующим образом

ok: [hostname001] => {" msg ":" envt is backend "}


Как я могу убедиться, что выбрана правильная переменная.

1 Ответ

3 голосов
/ 24 апреля 2020

Проблема в том, что независимо от того, как вы установили переменную group, ваш хост hostname001 все еще является членом обеих групп. Вам нужно будет подойти к этому, используя другой метод.

Один из вариантов - просто переместить переменную из вашего инвентаря и получить пару отдельных файлов переменных, которые вы используете с параметром -e. , Например, вы можете назвать ansible-playbook следующим образом:

ansible-playbook playbook.yml -e @config1.yml

Или:

ansible-playbook playbook.yml -e @config2.yml

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

В качестве последнего варианта вы можете назначить целевому хосту другое имя в каждой группе. Например, что-то вроде:

[backend]
hostname001-backend ansible_host=hostname001

[backend:vars]
envt=backend

[frontend]
hostname001-frontend ansible_host=hostname001

[frontend:vars]
envt=frontend

Используя этот инвентарь, мы видим:

$ ansible-playbook playbook.yml -e group=frontend

PLAY [Sample play] ***************************************************************************

TASK [Do a demo] *****************************************************************************
ok: [hostname001-frontend] => {
    "msg": "The envt is frontend"
}

PLAY RECAP ***********************************************************************************
hostname001-frontend       : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$ ansible-playbook playbook.yml -e group=backend

PLAY [Sample play] ***************************************************************************

TASK [Do a demo] *****************************************************************************
ok: [hostname001-backend] => {
    "msg": "The envt is backend"
}

PLAY RECAP ***********************************************************************************
hostname001-backend        : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
...