0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Подготовка рабочего окружения - это весьма распространённая задача. И Ansible с ней отлично справляется. Установить Git, настроить его, установить нужные приложения - всё это мы можем выполнить, если опишем нужные действия в плейбуке.</p>
1
<p>Подготовка рабочего окружения - это весьма распространённая задача. И Ansible с ней отлично справляется. Установить Git, настроить его, установить нужные приложения - всё это мы можем выполнить, если опишем нужные действия в плейбуке.</p>
2
<h2>Пример файла playbook.yml</h2>
2
<h2>Пример файла playbook.yml</h2>
3
- name: Install tools packages hosts: localhost # Для всего блока будет запрошена эскалация привилегий become: yes tasks: - name: install packages ansible.builtin.apt: update_cache: yes state: present name: - git - curl - fzf # В одном плейбуке может быть несколько блоков, # из ролей и задач. В том числе могут быть и другие хосты - name: install and setup docker hosts: localhost become: yes # Роли выполнятся до задач, # даже если в плейбуке они будут идти после задач roles: # Роли, которые взяты из Galaxy # вызываются по имени с неймспейсом (имя пользователя, имя роли) - name: geerlingguy.docker vars: docker_users: # Чтобы использовать значение переменной # используют кавычки и двойные фигурные скобки - "{{ user }}" - name: Install and setup zsh hosts: localhost roles: - role: gantsign.oh-my-zsh vars: oh_my_zsh_install: yes users: - username: "{{ user }}" oh_my_zsh: theme: "{{ zsh_theme }}" plugins: - git - docker - docker-compose - zsh-syntax-highlighting - role: markosamuli.asdf vars: asdf_init_shell: true tasks: - name: Set zsh become: yes ansible.builtin.user: name: "{{ user }}" shell: /bin/zsh - name: Add $HOME/.local/bin to path ansible.builtin.lineinfile: state: present path: ~/.zshrc line: export PATH="$HOME/.local/bin:$PATH" - name: Install asdf and plugins hosts: localhost roles: - role: markosamuli.asdf vars: asdf_plugins: - name: "ruby" versions: ["3.0.1"] global: "3.0.1" - name: "nodejs" versions: ["16.3.0"] global: "16.3.0" - name: Setup git config hosts: localhost tasks: - name: Set global user.email # Модуль находится в коллекции Community.general, # для его вызова нужно обращаться по полному имени community.general.git_config: name: user.email scope: global value: "{{ git_user_email }}" - name: Set global user.name community.general.git_config: name: user.name scope: global value: "{{ git_user_name }}" - name: Setup aliases to ~/.gitconfig community.general.git_config: name: "alias.{{ item.name }}" scope: global # Задача вызывается несколько раз в цикле # Каждый элемент - это объект, указанный в with_items ниже value: "{{ item.value }}" with_items: - { name: co, value: checkout } - { name: ci, value: commit } - { name: st, value: status } - { name: br, value: branch } - { name: hist, value: "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short" } - { name: type, value: 'cat-file -t' } - { name: dump, value: 'cat-file -p' } - { name: commend, value: 'commit --amend' } - name: Set vim as editor community.general.git_config: name: core.editor scope: global value: vim - name: Copy git global ignore file ansible.builtin.copy: # Файлы, которые должны быть скопированы, находятся относительно плейбука рядом src: files/gitignore_global dest: "~/.gitignore_global" - name: Set global gitignore community.general.git_config: name: core.excludesFile scope: global value: ~/.gitignore_global<h2>Пример файла<em>requirements.yml</em></h2>
3
- name: Install tools packages hosts: localhost # Для всего блока будет запрошена эскалация привилегий become: yes tasks: - name: install packages ansible.builtin.apt: update_cache: yes state: present name: - git - curl - fzf # В одном плейбуке может быть несколько блоков, # из ролей и задач. В том числе могут быть и другие хосты - name: install and setup docker hosts: localhost become: yes # Роли выполнятся до задач, # даже если в плейбуке они будут идти после задач roles: # Роли, которые взяты из Galaxy # вызываются по имени с неймспейсом (имя пользователя, имя роли) - name: geerlingguy.docker vars: docker_users: # Чтобы использовать значение переменной # используют кавычки и двойные фигурные скобки - "{{ user }}" - name: Install and setup zsh hosts: localhost roles: - role: gantsign.oh-my-zsh vars: oh_my_zsh_install: yes users: - username: "{{ user }}" oh_my_zsh: theme: "{{ zsh_theme }}" plugins: - git - docker - docker-compose - zsh-syntax-highlighting - role: markosamuli.asdf vars: asdf_init_shell: true tasks: - name: Set zsh become: yes ansible.builtin.user: name: "{{ user }}" shell: /bin/zsh - name: Add $HOME/.local/bin to path ansible.builtin.lineinfile: state: present path: ~/.zshrc line: export PATH="$HOME/.local/bin:$PATH" - name: Install asdf and plugins hosts: localhost roles: - role: markosamuli.asdf vars: asdf_plugins: - name: "ruby" versions: ["3.0.1"] global: "3.0.1" - name: "nodejs" versions: ["16.3.0"] global: "16.3.0" - name: Setup git config hosts: localhost tasks: - name: Set global user.email # Модуль находится в коллекции Community.general, # для его вызова нужно обращаться по полному имени community.general.git_config: name: user.email scope: global value: "{{ git_user_email }}" - name: Set global user.name community.general.git_config: name: user.name scope: global value: "{{ git_user_name }}" - name: Setup aliases to ~/.gitconfig community.general.git_config: name: "alias.{{ item.name }}" scope: global # Задача вызывается несколько раз в цикле # Каждый элемент - это объект, указанный в with_items ниже value: "{{ item.value }}" with_items: - { name: co, value: checkout } - { name: ci, value: commit } - { name: st, value: status } - { name: br, value: branch } - { name: hist, value: "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short" } - { name: type, value: 'cat-file -t' } - { name: dump, value: 'cat-file -p' } - { name: commend, value: 'commit --amend' } - name: Set vim as editor community.general.git_config: name: core.editor scope: global value: vim - name: Copy git global ignore file ansible.builtin.copy: # Файлы, которые должны быть скопированы, находятся относительно плейбука рядом src: files/gitignore_global dest: "~/.gitignore_global" - name: Set global gitignore community.general.git_config: name: core.excludesFile scope: global value: ~/.gitignore_global<h2>Пример файла<em>requirements.yml</em></h2>
4
# Зависимости для ansible делятся на роли и коллекции (ролей) # Роли и коллекции можно найти на https://galaxy.ansible.com/ roles: - name: geerlingguy.docker # Без указания версии ставится самая последняя версия version: '4.0.0' - name: gantsign.oh-my-zsh - name: markosamuli.asdf collections: - community.general<h2>Пример файла<em>inventory.ini</em></h2>
4
# Зависимости для ansible делятся на роли и коллекции (ролей) # Роли и коллекции можно найти на https://galaxy.ansible.com/ roles: - name: geerlingguy.docker # Без указания версии ставится самая последняя версия version: '4.0.0' - name: gantsign.oh-my-zsh - name: markosamuli.asdf collections: - community.general<h2>Пример файла<em>inventory.ini</em></h2>
5
; Файл может не имеет расширения .ini или называться по другому ; Инвентори файл может быть описан в yml формате ; https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html ; алиас (имя хоста в рамках Ansible), адрес, тип подключения (для удаленных хостов используется ssh подключение) localhost ansible_host=127.0.0.1 ansible_connection=local<h2>Пример файла<em>host_vars/localhost.yml</em></h2>
5
; Файл может не имеет расширения .ini или называться по другому ; Инвентори файл может быть описан в yml формате ; https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html ; алиас (имя хоста в рамках Ansible), адрес, тип подключения (для удаленных хостов используется ssh подключение) localhost ansible_host=127.0.0.1 ansible_connection=local<h2>Пример файла<em>host_vars/localhost.yml</em></h2>
6
# Имя файла это имя хоста, которое указано в инвентори файле # host_vars/<hostname>.yml - это соглашение по которому Ansible подгружает переменные # https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#understanding-variable-precedence # Синтаксис - обычный yml # Эти переменные будут привязаны к хосту, к ним можно обратиться в плейбуке param: abc param2: "{{ param }}"<h2>Команды, которые могут пригодиться</h2>
6
# Имя файла это имя хоста, которое указано в инвентори файле # host_vars/<hostname>.yml - это соглашение по которому Ansible подгружает переменные # https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#understanding-variable-precedence # Синтаксис - обычный yml # Эти переменные будут привязаны к хосту, к ним можно обратиться в плейбуке param: abc param2: "{{ param }}"<h2>Команды, которые могут пригодиться</h2>
7
# Запуск adhoc команды ansible localhost -m ping # Запуск плейбука выполняется командой ansible-playbook # Флаг -v, -vv, -vvv указывает на подробность вывода Ansible # флаг -i указывает на файл инвентори в котором прописаны хосты для запуска ansible-playbook -i inventory.ini playbook.yml -v # флаг -K это сокращенная запись флага --ask-become-pass # для указания пароля для sudo (когда указываем become: true для эскалации прав) ansible-playbook -i inventory.ini playbook.yml -v -K # Установка ролей и коллекций выполняется разными командами ansible-galaxy collection install -r requirements.yml ansible-galaxy role install -r requirements.yml
7
# Запуск adhoc команды ansible localhost -m ping # Запуск плейбука выполняется командой ansible-playbook # Флаг -v, -vv, -vvv указывает на подробность вывода Ansible # флаг -i указывает на файл инвентори в котором прописаны хосты для запуска ansible-playbook -i inventory.ini playbook.yml -v # флаг -K это сокращенная запись флага --ask-become-pass # для указания пароля для sudo (когда указываем become: true для эскалации прав) ansible-playbook -i inventory.ini playbook.yml -v -K # Установка ролей и коллекций выполняется разными командами ansible-galaxy collection install -r requirements.yml ansible-galaxy role install -r requirements.yml