Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
service:ansible [07.08.2025 14:49] – [Замена текста в файлах] viacheslav | service:ansible [26.08.2025 17:47] (текущий) – [Выбор каталога шаблона в зависимости от группы хоста] viacheslav |
---|
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 |
===== Задача ===== | ===== Задача ===== |
Базовый элемент. | Базовый элемент. |
===== Замена текста в файлах ===== | ===== Замена текста в файлах ===== |
Удаление шеллом всех бэкапов целевого файла, затем новый бэкап и замена текста.\\ | Удаление шеллом всех бэкапов целевого файла, затем новый бэкап и замена текста.\\ |
Применяется именованные референсы, т. к. числовые несовместимы с цифрами, например, ''%%\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.*" |
-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]] |
| |
====== Ошибки, проблемы ====== | ====== Ошибки, проблемы ====== |
| |
[[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 запустить задачу, если сервер не входит в группу]] |
| |
| |