Инструменты пользователя

Инструменты сайта


service:ansible

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
service:ansible [07.08.2025 14:49] – [Замена текста в файлах] viacheslavservice:ansible [26.08.2025 17:47] (текущий) – [Выбор каталога шаблона в зависимости от группы хоста] viacheslav
Строка 37: Строка 37:
 ansible all -i "k3.example.com," -m ping ansible all -i "k3.example.com," -m ping
 </code> </code>
 +
 +https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html
 ===== Задача ===== ===== Задача =====
 Базовый элемент. Базовый элемент.
Строка 1136: Строка 1138:
 ===== Замена текста в файлах ===== ===== Замена текста в файлах =====
 Удаление шеллом всех бэкапов целевого файла, затем новый бэкап и замена текста.\\ Удаление шеллом всех бэкапов целевого файла, затем новый бэкап и замена текста.\\
-Применяется именованные референсы, т. к. числовые несовместимы с цифрами, например, ''%%\1800\2%%'' даст ошибку.+Применяются именованные референсы (backreferences), т. к. числовые несовместимы с цифрами, например, ''%%\1800\2%%'' даст ошибку.
 <code yaml> <code yaml>
 ansible all -u admin -m shell -a "rm /opt/app/PG/job-config.xml.*" ansible all -u admin -m shell -a "rm /opt/app/PG/job-config.xml.*"
Строка 1142: Строка 1144:
 -a "path=/opt/app/PG/job-config.xml regexp='(?P<start>max-connections\">)400(?P<end><)' replace='\g<start>800\g<end>' backup=yes" -a "path=/opt/app/PG/job-config.xml regexp='(?P<start>max-connections\">)400(?P<end><)' replace='\g<start>800\g<end>' backup=yes"
 </code> </code>
 +https://docs.ansible.com/ansible/latest/collections/ansible/builtin/replace_module.html\\
 https://linuxbuz.com/devops/replace-a-string-in-a-file-with-ansible-replace-module\\ https://linuxbuz.com/devops/replace-a-string-in-a-file-with-ansible-replace-module\\
 https://www.linuxtechi.com/replace-strings-lines-with-ansible https://www.linuxtechi.com/replace-strings-lines-with-ansible
 +
 +===== Шаблон-цикл для составления конфигурационного файла из нескольких однотипных секций =====
 +Здесь секция пишется, если хост входит в группу, совпадающую с ''alias'' в списке ''queues''. Можно сделать по любому другому условию.\\
 +Если не подходит ''alias'', можно добавить в каждый пункт списка переменных ещё один параметр, например, ''tag: my_group'' и ориентироваться на него.
 +<file xml templates/queue-settings.xml.j2>
 +<?xml version="1.0" encoding="windows-1251"?>
 +<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
 +<properties>
 +
 +{% for q in queues if q.alias in group_names %}
 +<entry key="queue-{{ loop.index0 }}.alias">{{ q.alias }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-cache-mode">{{ q.cache_mode }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jms-factory-name">{{ q.factory_name }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jms-factory-url">{{ q.factory_url }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jms-factory-prefix">{{ q.factory_prefix }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jms-factory-connectionFactory">{{ q.factory_connection }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jms-factory-username">{{ q.factory_username }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jms-factory-password">{{ q.factory_password }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jmx-url">{{ q.jmx_url }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jmx-broker">{{ q.jmx_broker }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jmx-username">{{ q.jmx_username }}</entry>
 +<entry key="queue-{{ loop.index0 }}.cft-jmx-password">{{ q.jmx_password }}</entry>
 +
 +{% endfor %}
 +</properties>
 +</file>
 +
 +<file yaml vars/main.yml>
 +queues:
 +  - alias: "rrr1"
 +    cache_mode: "true"
 +    factory_name: "org.apache.activemq.jndi.ActiveMQInitialContextFactory"
 +    factory_url: "tcp://server3.example.com:8881?jms.prefetchPolicy.queuePrefetch=0"
 +    factory_prefix: "dynamicQueues/"
 +    factory_connection: "ConnectionFactory"
 +    factory_username: "rkf1admin"
 +    factory_password: "P@ssw0rd1"
 +    jmx_url: "service:jmx:rmi:///jndi/rmi://server4.example.com:11099/jmxrmi"
 +    jmx_broker: "Broker_TEST2"
 +    jmx_username: "write"
 +    jmx_password: ";o23489yrn8"
 +  - alias: "test_servers"
 +    cache_mode: "false"
 +    factory_name: "org.apache.activemq.jndi.ActiveMQInitialContextFactory"
 +    factory_url: "tcp://server5.example.com:8881?jms.prefetchPolicy.queuePrefetch=0"
 +    factory_prefix: "dynamicQueues/"
 +    factory_connection: "ConnectionFactory"
 +    factory_username: "adminnn"
 +    factory_password: "P@ssw0rddd"
 +    jmx_url: "service:jmx:rmi:///jndi/rmi://server8.example.com:11099/jmxrmi"
 +    jmx_broker: "Broker_TEST6"
 +    jmx_username: "controleRole"
 +    jmx_password: "aasdpkpdjpeeeee"
 +</file>
 +
 +[[https://www.youtube.com/watch?v=lUBPAGI9W6U|Ansible for Network Configuration Templates]] ([[https://github.com/dmahler/ansible-template/tree/master|Github]])\\
 +[[http://onreader.mdl.ru/MasteringAnsible.3ed/content/Ch05.html|Глава 5. Высвобождение всей мощи шаблонов Jinja2]] (James Freeman, Jesse Keating - Mastering Ansible, 3rd ed.)\\
 +[[https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html#extended-loop-variables|Extended loop variables]]\\
 +[[https://docs.ansible.com/ansible/latest/reference_appendices/special_variables.html|Special Variables]]
 +
 +===== Lingering =====
 +Включение возможности для непривилегированного пользователя запускать демоны systemd, которые работают после выхода пользователя из своего сеанса.
 +<code yaml>
 +- name: Ensure lingering enabled for user {{ deploy_user }}
 +  command: 
 +    cmd: loginctl enable-linger {{ deploy_user }}
 +    creates: /var/lib/systemd/linger/{{ deploy_user }}
 +</code>
 +[[https://github.com/ansible/ansible/issues/72674#issuecomment-801200193]]
 +
 +Ad-hoc:
 +<code bash>
 +ansible k3 -m command -a "loginctl enable-linger user creates=/var/lib/systemd/linger/user"
 +</code>
 +
 +===== Выбор каталога шаблона в зависимости от группы хоста =====
 +Здесь: группы ''rrr1copy'', ''test1'' и ''test2'' входят в группу ''queue_settings'' в inventory.\\
 +Для каждой группы создан свой ''queue-settings.xml.j2'' в соответствующем подкаталоге в templates.
 +<code yaml>
 +- name: Delete queue-settings.xml from unauthorized servers
 +  file:
 +    path: "{{ postgres_dir }}/queue-settings.xml"
 +    state: absent
 +  when: inventory_hostname not in groups["queue_settings"]
 +  tags:
 +  - postgres
 +
 +- name: Copy template queue-settings.xml
 +  template:
 +    src: "postgres/{{ group_names |select('match', 'rrr1copy|test[12]') |join() }}/queue-settings.xml.j2"
 +    dest: "{{ postgres_dir }}/queue-settings.xml"
 +    owner: "{{ deploy_user }}"
 +    mode: 0660
 +  when: inventory_hostname in groups["queue_settings"]
 +  tags:
 +  - postgres
 +</code>
 +https://www.reddit.com/r/ansible/comments/ozopzi/list_hosts_in_group_and_filter/
 +
 +===== Слияние переменных-словарей =====
 +По умолчанию, одноимённая дочерняя переменная полностью перезаписывает родительскую.
 +<code yaml>
 +# group_vars/all.yml
 +settings:
 +  user: "Vasya"
 +  group: "Managers"
 +  mood: "Angry"
 +  status: "Divorced"
 +  
 +# group_vars/k3.yml
 +settings:
 +  user: "Kolya"
 +  group: "Admins"
 +  mood: "Frustrated"
 +
 +# Результат
 +- debug:
 +    var: settings
 +
 +ok: [k3.workgroup] => {
 +    "settings": {
 +        "group": "Admins",
 +        "mood": "Frustrated",
 +        "user": "Kolya"
 +    }
 +}
 +</code>
 +
 +Чтобы дочерняя переменная дополняла родительскую, нужно переименовать переменные в файлах ''group_vars'' и применить фильтр ''combine()'' в плейбуке, чтобы собрать их вместе.
 +<code yaml>
 +# vars_test.yml
 +- hosts: k3
 +  remote_user: user
 +  roles:
 +    - role: vars_test
 +  vars:
 +    settings: "{{ settings_all | combine(settings_host, recursive=true) }}"
 +
 +# Результат
 +- debug:
 +    var: settings
 +    
 +ok: [k3.workgroup] => {
 +    "settings": {
 +        "group": "Admins",
 +        "mood": "Frustrated",
 +        "status": "Divorced",
 +        "user": "Kolya"
 +    }
 +}
 +</code>
 +Затем в шаблонах уже можно применять ''%%{{ settings.user }}%%'' и т. д.\\
 +:!: Параметр ''hash_behaviour=merge'', добавляемый в ''ansible.cfg'', считается устаревшим и нежелательным к применению.
 +
 +[[https://serverfault.com/questions/900414/how-to-merge-variables-of-type-hash-across-different-variable-files-in-ansible|How to merge variables of type hash across different variable files in ansible?]]\\
 +[[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/combine_filter.html|ansible.builtin.combine filter – combine two dictionaries]]
 +
 ====== Ошибки, проблемы ====== ====== Ошибки, проблемы ======
  
Строка 1191: Строка 1351:
 [[https://www.youtube.com/playlist?list=PLT98CRl2KxKEUHie1m24-wkyHpEsa4Y70|Getting started with Ansible (Learn Linux TV)]]\\ [[https://www.youtube.com/playlist?list=PLT98CRl2KxKEUHie1m24-wkyHpEsa4Y70|Getting started with Ansible (Learn Linux TV)]]\\
 [[https://ezhvsalate.ru/posts/ansible-peredaem-json-v-tele-zaprosa-ispolzuia-modul-uri|Ansible: передаем json в теле запроса, используя модуль uri]]\\ [[https://ezhvsalate.ru/posts/ansible-peredaem-json-v-tele-zaprosa-ispolzuia-modul-uri|Ansible: передаем json в теле запроса, используя модуль uri]]\\
 +[[https://stackoverflow.com/questions/21008083/run-task-only-if-host-does-not-belong-to-a-group|Как в Ansible запустить задачу, если сервер не входит в группу]]
  
  
service/ansible.1754578151.txt.gz · Последнее изменение: viacheslav

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki