Ansible lineinfile со списком для установки серверов ntp - PullRequest
0 голосов
/ 14 мая 2018

Я хочу добавить несколько строк в файл (они являются ntp-серверами в /etc/ntp.conf).К сожалению, я не могу использовать шаблон по разным причинам.поэтому у меня есть переменная, например, так:

vars:
- dns:
  - "{ 'region': 'syd', 'dns_servers': ['1.2.3.4', '2.3.4.5', '3.4.5.6' ] }"
  - "{ 'region': 'lon', 'dns_servers': ['2.2.2.2', '3.3.3.3', '4.4.4.4' ] }"
  - "{ 'region': 'ny',  'dns_servers': ['5.5.5.5', '6.6.6.6', '7.7.7.7' ] }"
- ntp:
  - { 'region': 'syd', 'ntp_servers': ['syd1.pool.ntp.org','syd2.pool.ntp.org','syd2.pool.ntp.org'] }
  - { 'region': 'lon', 'ntp_servers': ['lon1.pool.ntp.org','lon2.pool.ntp.org','lon2.pool.ntp.org'] }
  - { 'region': 'ny',  'ntp_servers': ['ntp1.pool.ntp.org','ntp2.pool.ntp.org','ntp2.pool.ntp.org'] }

Так что там 2 списка;днс и нтп.Каждый список содержит словарь регионов -> сопоставления серверов.

Я хочу перебрать список (в данном случае список ntp), чтобы добавить строку для каждого сервера ntp по очереди.Я обнаружил параметр loop_control для конструкции цикла, которая позволяет мне устанавливать смещение в списке ntp_servers.

Вот одна попытка, которую я делаю, чтобы перебрать элементы списка в словаре:

- name: Replace ntp servers in /etc/ntp.conf
    debug:
      msg: "{{ item[loop_count] }}"
    loop: "{{ ntp['region']['ntp_servers'] }}"
    loop_control:
      index_var: loop_count
    when: item.region == region

(Кроме того, как вы относитесь к использованию 'i' в качестве переменной счетчика цикла?)

Я знаю, что это будет намного проще с шаблоном, и этот lineinfileантипаттерн, но я ограничен проблемами, не зависящими от меня.

Проблема, с которой я столкнулся, заключается в том, что я хочу перебирать элементы массива ntp_servers, но мой цикл перебирает словарь ntp.Я пробовал разные комбинации, но подозреваю, что я использую неправильную структуру данных - кто-нибудь может посоветовать, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 14 мая 2018

Я вижу проблему со структурой vars. Вы должны удалить дефис из объявления переменных ntp и dns:

вары: нтп: ..... DNS: .....

Кроме того, двойные кавычки в элементах списка dns делают элементы, рассматриваемые как строки, ntp выглядят нормально.

чтобы получить все 9 ntp-серверов переменной ntp в списке, чтобы вы могли обрабатывать их в цикле, вы можете использовать выражение (не стесняйтесь удалять sum(start=[]) и окончательное преобразование list, а затем добавьте их обратно, чтобы понять, почему я их использовал):

"{{ ntp | map(attribute='ntp_servers') | list | sum(start=[]) | list }}"

пример playbook:

- hosts: localhost
  gather_facts: false
  vars:
    ntp:
      - { 'region': 'syd', 'ntp_servers': ['syd1.pool.ntp.org','syd2.pool.ntp.org','syd2.pool.ntp.org'] }
      - { 'region': 'lon', 'ntp_servers': ['lon1.pool.ntp.org','lon2.pool.ntp.org','lon2.pool.ntp.org'] }
      - { 'region': 'ny',  'ntp_servers': ['ntp1.pool.ntp.org','ntp2.pool.ntp.org','ntp2.pool.ntp.org'] }

  tasks:
    - name: print
      debug: 
        msg: "{{ item }}"
      with_items: 
        - "{{ ntp | map(attribute='ntp_servers') | list | sum(start=[]) | list }}"

выход:

TASK [print] ********************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "syd1.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "syd2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "syd2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "lon1.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "lon2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "lon2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "ntp1.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "ntp2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
    "msg": "ntp2.pool.ntp.org"
}

PLAY RECAP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...