Выбор хоста из группы инвентаря на основе переменной хоста - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть файл инвентаризации, который выглядит следующим образом:

[web]
web1.so.com tech=apache
web2.so.com tech=nginx

Я хотел бы перечислить веб-хосты в файле конфигурации, только если технология nginx.Поэтому в этом случае я бы хотел, чтобы шаблон ANSIBLE генерировал приведенное ниже в конфигурационном файле.

server: web2.so.com

Как я могу получить ответ для вставки веб-хостов, только если tech = nginx?

Обычно я получаю доступ к хостам, устанавливая с помощью групп в шаблоне ansible:

server: "{{groups['web']}}"

Но я знаю, что это перечислит все хосты в сетиgroup.

Я не могу понять, как выбирать хосты, имеющие tech=nginx, и в этом случае невозможно разделить их на группы web-nginx и web-apache.

Также невозможно жестко закодировать его для использования web2, так как хост apache может меняться при каждой перестройке.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

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

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

---
- name: Create dynamic tech groups
  hosts: all
  gather_facts: false

  tasks:
    - name: Create the groups depending on tech
      group_by:
        key: "tech_{{ tech }}"
      when: tech is defined

- name: Do something on nginx group
  hosts: tech_nginx
  gather_facts: false

  tasks:
    - name: Show it works
      debug:
        msg: "I'm running on {{ inventory_hostname }}"

Конечно, как только это будет сделано, вы можете использовать groups['tech_nginx'] в другом месте вашей книги, чтобы получить список хостов в этой группе.

0 голосов
/ 23 сентября 2019

Q: "Список веб-хостов в файле конфигурации, только если технология nginx."

A: Можно использовать json_query .Например, игра ниже

- hosts: all
  tasks:
    - set_fact:
        nginx_list: "{{ hostvars|dict2items|
                        json_query('[?value.tech==`nginx`].key') }}"
      run_once: true
    - debug:
        var: nginx_list

дает переменную nginx_list , которую можно использовать в конфигурации.

ok: [web1.so.com] => {
    "nginx_list": [
        "web2.so.com"
    ]
}
ok: [web2.so.com] => {
    "nginx_list": [
        "web2.so.com"
    ]
}

Например lineinfile ниже

- lineinfile:
    path: /tmp/webservers.cfg
    regex: "^nginx\\s*=(.*)$"
    line: "nginx = {{ nginx_list|join(', ') }}"
    create: true
  delegate_to: localhost

т

$ cat /tmp/webservers.cfg 
nginx = web2.so.com
...