Anton
В среднем количество промежуточных серверов от 200 до 1000. В среднем количество хостов на промежуточный сервер от 5 до 150. В данный момент пилотная группа 180 промежуточных и по ~50 на сервер.
Timur
И вы все это хотите раскатывать с одной машины-контроллера?
inqfen
Если много хостов - он лучше всего справляется
Petr
Ребята, приветствую! Что-то я запутался с регулярками, кавычками и экранированием. Помогите разобраться пожалуйста. Нужно в файле поменять строку (много разных строк, потому и цикл использую) list listen_http '[::]:80' на list listen_http '[::]:8080' - name: Change gui ports loop: - {regexp: 'list listen_http \Q''[::]:80''\E', line: " list listen_http '[::]:8080'"} lineinfile: dest: /etc/config/uhttpd regexp: '{{ item.regexp }}' line: '{{ item.line }}' Получаю такую ошибку: An exception occurred during task execution. To see the full traceback, use -vvv. The error was: re.error: bad escape \Q at position 17 failed: [openwrt.lan] (item={'regexp': "list listen_http \\Q'[::]:80'\\E", 'line': "\tlist listen_http '[::]:8080'"}) => changed=false ansible_loop_var: item item: line: "\tlist listen_http '[::]:8080'" regexp: list listen_http \Q'[::]:80'\E module_stderr: |- ***Далее длинный трэйс" re.error: bad escape \Q at position 17 module_stdout: '' msg: |- MODULE FAILURE See stdout/stderr for the exact error rc: 1 Как побороть?
Anton
И вы все это хотите раскатывать с одной машины-контроллера?
Да, с одного контроллера контролировать
Anonymous
коллеги, подскажите как правильно проверить, что строка не пустая - name: check value is not null fail: msg="secret {{item.key_name}} null, check our permission and secret" when: '"{{item.value}}" == ""' with_items: "{{ vault_list_users_secret }}"
Anonymous
текущий код рабочий, но получае warning [WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: "{{item.value}}" == ""
Anonymous
блин век живи - век учись, спасибо коллеги
Timur
Да, с одного контроллера контролировать
Плохая идея изначально. При таких масштабах смотрите в сторону Ansible Tower или AWX. На худой конец, можно ansible-pull на промежуточные хосты поставить и синкать.
Sergey
Ну и до кучи в when не нужно использовать jinja. when: item.value|length != 0
Зачем путаешь человека? Jinja Там фактически всё равно используется, просто записывать надо так. как будто за тебя уже фигурные скобки записали, т.е. без них.
Petr
Ребята, приветствую! Что-то я запутался с регулярками, кавычками и экранированием. Помогите разобраться пожалуйста. Нужно в файле поменять строку (много разных строк, потому и цикл использую) list listen_http '[::]:80' на list listen_http '[::]:8080' - name: Change gui ports loop: - {regexp: 'list listen_http \Q''[::]:80''\E', line: " list listen_http '[::]:8080'"} lineinfile: dest: /etc/config/uhttpd regexp: '{{ item.regexp }}' line: '{{ item.line }}' Получаю такую ошибку: An exception occurred during task execution. To see the full traceback, use -vvv. The error was: re.error: bad escape \Q at position 17 failed: [openwrt.lan] (item={'regexp': "list listen_http \\Q'[::]:80'\\E", 'line': "\tlist listen_http '[::]:8080'"}) => changed=false ansible_loop_var: item item: line: "\tlist listen_http '[::]:8080'" regexp: list listen_http \Q'[::]:80'\E module_stderr: |- ***Далее длинный трэйс" re.error: bad escape \Q at position 17 module_stdout: '' msg: |- MODULE FAILURE See stdout/stderr for the exact error rc: 1 Как побороть?
В итоге получилось вот так: - name: Change openwrt web gui ports vars: http_port: 8080 https_port: 443443 loop: - {regexp: "list listen_http '0.0.0.0:", line: "\tlist listen_http '0.0.0.0:{{ http_port }}'"} - {regexp: "list listen_http '\\[::\\]:", line: "\tlist listen_http '[::]:{{ http_port }}'"} - {regexp: "list listen_https '0.0.0.0:", line: "\tlist listen_https '0.0.0.0:{{ https_port }}'"} - {regexp: "list listen_https '\\[::\\]:", line: "\tlist listen_https '[::]:{{ https_port }}'"} lineinfile: dest: /etc/config/uhttpd regexp: '{{ item.regexp }}' line: '{{ item.line }}' Не очень красиво, но зато работает.
Anton
Плохая идея изначально. При таких масштабах смотрите в сторону Ansible Tower или AWX. На худой конец, можно ansible-pull на промежуточные хосты поставить и синкать.
При таких масштабах как раз AWX и думаю tower будут страдать от динамического инвентаря очень сильно. Консольный ansible-playbook с созданием файла retry как бы перекрывает данную проблему.
Ivan
Привет! Как удалить содержимое директории, не удаляя саму директорию? Потому что это точка монтирования кроме shell: rm -rf dir/* есть что?
Ivan
Или делать через find, а потом передавать этот список на ремув?
Timur
- name: remove web dir contents file: path: "{{ item }}" state: absent with_fileglob: - "/home/mydata/web/*"
Timur
Или более навороченный - через synchronize
Timur
- name: Create an empty directory (locally) local_action: module: file state: directory path: "/tmp/empty" - name: Empty remote directory synchronize: src: /tmp/empty/ dest: /home/mydata/web/ delete: yes recursive: yes
Anonymous
странный вопрос, но как вывести значение перменной в файл на удаленном хосте. Про дебаг комангду знаю но мне нужно именно в файл на удаленном хосте
Anonymous
есть сертификат взятый с волта, он помещается в перенную из которй нужно и вывести в файл
Anonymous
а это идея спасибо, попробую
Anonymous
получилось, супер. И даже без башсибла обошлось
Alex
подскажите, что за особенность
Alex
- name: Check elasticsearch cluster health uri: url: http://localhost:9200/_cluster/health method: GET register: elasticsearch_ha_health_result until: elasticsearch_ha_health_result.status == 200 retries: 1 delay: 5 ignore_errors: yes - name: Set cluster node count set_fact: elasticsearch_ha_node_count: "{{ elasticsearch_ha_health_result.json['number_of_nodes'] | default(0) }}" - fail: msg="{{ elasticsearch_ha_node_count }}" В случае недоступности ES на 2.9 я получаю 0, а на 2.7 получаю ошибку TASK [itests/jfmc : Set cluster node count] *** fatal: [app_master]: FAILED! => msg: |- The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'json'
Отделение Bereke Bank
Timur
чем это лучше шелла?
Все, что не шелл, лучше шелла :)
Dmitriy
Понятно
на самом деле проблема шелла в том, что дебажить гораздо сложнее, чем готовые модули. СОбственно готовые модули и работают в разы лучше, так что шелл только в крайнем случае. Говорю, как бывший больной башизмом )
Ivan
Да, но дофига моментов, которые готовые модули не делают вообще
Ivan
Чтобы удалить содержимое директории, надо чтото выдумывать Модуль git тоже позволяет весь функционал гита использовать? нет
Timur
Чтобы удалить содержимое директории, надо чтото выдумывать Модуль git тоже позволяет весь функционал гита использовать? нет
Ничего особенного выдумывать не нужно. Выше есть как минимум два работающих варианта. Без всякого шелла
Ivan
Допиши.
И оно сразу появится в апстриме, ага
Aleksey
George
По мотивам недавней проблемы: как работать с парами хостов из разных групп. https://medium.com/opsops/host-cross-linking-in-ansible-276a3bebe83a. Критика приветствуется.
Timur
INI-инвентори в 2020? Штош
Там и yaml как итоговое решение далее
Sergey
Там и yaml как итоговое решение далее
...We keep inventory intact: [providers] provider1 pkey=42 provider2 pkey=41 provider3 pkey=43 [consumers] consumer1 ckey=99 consumer2 ckey=33 consumer3 ckey=19 .... Вот это прям из статьи, из самого конца - "оставим инвентори как есть"
George
...We keep inventory intact: [providers] provider1 pkey=42 provider2 pkey=41 provider3 pkey=43 [consumers] consumer1 ckey=99 consumer2 ckey=33 consumer3 ckey=19 .... Вот это прям из статьи, из самого конца - "оставим инвентори как есть"
Ага. Я придумал, как избежать явного указания пары. Грубо говоря, автогруппировка по парам по стабильному признаку.
George
Ini инвентори там для удобства чтения.
Sergey
Ini инвентори там для удобства чтения.
Ну вот и смотри теперь: кто-то читает статью и думает "о, инвентори пишется в ини-формате, понятно"
Balagur
всем привет! может кто подскажет ставлю через модуль pip, и выводится ошибка "Unable to find any of pip2, pip to use. pip needs to be installed.", хотя на хосте pip установлен.
George
Если человек страдает с выбором ini vs yaml, то ему рано о таких проблемах в статье думать.
Ivan
- name: remove web dir contents file: path: "{{ item }}" state: absent with_fileglob: - "/home/mydata/web/*"
Не удалит вложенные директории, нет рекурсии, так?
Balagur
ubuntu?
На хосте centos
Balagur
Timur
Второй
Пакет python-pip установлен?
Balagur
С хоста pip install запускается корректно
Sergey
На хосте centos
Как тогда задача вообще выглядит?
Timur
Значит, что-то в самом питоне сломано
Sergey
^^^ +++
Timur
Точно python-pip установлен?
Timur
Не просто pip
Tadeusz
а разница?
Tadeusz
pip == python-pip
Tadeusz
pip -V покажи
Timur
Поставь ансиблом пакет python-pip перед вызовом модуля pip
Timur
И проверь еще раз
Alex
А если параметр return_content добавить в модуль uri?
Сейчас попробую, но в обоих случаях сама переменная elasticsearch_ha_health_result одинаковая
Alex
TASK [itests/jfmc : fail] *** fatal: [app_master]: FAILED! => changed=false msg: attempts: 1 changed: false content: '' elapsed: 0 failed: true msg: 'Status code was -1 and not [200]: Request failed: <urlopen error [Errno 111] Connection refused>' redirected: false status: -1 url: http://localhost:9200/_cluster/health TASK [itests/jfmc : fail] *** fatal: [app_master]: FAILED! => changed=false msg: attempts: 1 changed: false content: '' failed: true msg: 'Status code was -1 and not [200]: Request failed: <urlopen error [Errno 111] Connection refused>' redirected: false status: -1 url: http://localhost:9200/_cluster/health