Этот пост был первоначально опубликован в thbe.org .
Как обещали в предыдущем сообщении гармонизировать базовую настройку с помощью Anisible, часть 1 Я хотел бы дрочить глубже в деталях об общей роли. Вот как это выглядит в файловой системе:
roles └── common ├── files │ └── user │ ├── alias.plugin.zsh │ ├── docker.plugin.zsh │ ├── functions.plugin.zsh │ ├── git.plugin.zsh │ ├── jekyll.plugin.zsh │ ├── nerd.plugin.zsh │ ├── puppet.plugin.zsh │ └── ruby.plugin.zsh ├── tasks │ ├── localtime.yml │ ├── main.yml │ ├── motd.yml │ ├── networking.yml │ ├── repositories.yml │ ├── tools.yml │ ├── upgrade.yml │ └── user.yml └── templates ├── ifcfg-interface.j2 ├── motd.j2 ├── network.j2 └── route-interface.j2
Наиболее важный файл является основным файлом Main.yml. Этот файл определяет, какие задачи будут выполнены, в каком порядке, когда называется общая роль. Поэтому нам нужен один файл, который называет роль (в моем случае Common.yml):
--- # Common playbook needs to executed first - name: Common configuration shared for all nodes hosts: all remote_user: root gather_facts: true roles: - common
Как только роль называется, сначала называет файл Main.yml:
--- # Main playbook for common configuration #- include: networking.yml - include: motd.yml - include: localtime.yml - include: repositories.yml - include: upgrade.yml - include: tools.yml - include: user.yml
Исходя из того, что это только демонстрация, которую я деактивировал сетевую часть. Эта часть ожидает, по крайней мере, три сетевых устройства, прикрепленные к разным сегментам сети, такие как внутренние, резервные копии, MPLS и так далее и так далее. Поскольку все узлы этой демонстрации имеют только один сетевой интерфейс, эта конфигурация все равно не будет работать. Итак, давайте пройдемся через задачи, которые активны и которые будут работать. Прежде всего, я настрою сообщение дня:
--- - name: Message of the day setup template: src: motd.j2 dest: /etc/motd owner: root group: root mode: 0644
Это довольно простая задача, требуется motd.j2
Шаблон (все шаблоны заканчиваются j2 из-за всех шаблонов Jinja2), который хранится в каталоге шаблона общей роли. Этот шаблон будет храниться на целевом узле под /etc/motd
С правами доступа 0644
Отказ Давайте посмотрим на чуть более сложный пример, конфигурация пользователя. Сама задача выглядит:
--- # Create all users defined in local_user (group_vars/all.yml) - name: Create personal user account user: name: "{{ item }}" password: "!" shell: /usr/bin/zsh groups: wheel generate_ssh_key: yes ssh_key_bits: 2048 ssh_key_file: .ssh/id_rsa loop: "{{ local_user }}" # Add local public rsa key to authorized_keys for all users defined in local_user (group_vars/all.yml) # This one needs to be reworked for multiple named users) - name: Add remote authorized key to allow future password-less logins authorized_key: user: "{{ item }}" key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" loop: "{{ local_user }}" # Add all users defined in local_user (group_vars/all.yml) to sudo administration group - name: Add personal user to sudoers lineinfile: path: /etc/sudoers regexp: "{{ item }} ALL" line: "{{ item }} ALL=(ALL) NOPASSWD: ALL" state: present validate: "/usr/sbin/visudo -cf %s" loop: "{{ local_user }}" # Install oh-my-zsh for all users defined in local_user (group_vars/all.yml) - name: Download oh-my-zsh installer get_url: url: https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh dest: /srv/oh-my-zsh-install.sh - name: Make oh-my-zsh-install.sh executable for all file: path: /srv/oh-my-zsh-install.sh mode: 0755 - name: Execute the zsh-installer.sh command: cmd: /srv/oh-my-zsh-install.sh creates: /home/{{ item }}/.oh-my-zsh become: yes become_user: "{{ item }}" loop: "{{ local_user }}" - name: Remove oh-my-zsh-install.sh file: path: /srv/oh-my-zsh-install.sh state: absent # Install typewritten for all users defined in local_user (group_vars/all.yml) - name: Deploy typewritten theme to oh-my-zsh using git git: repo: https://github.com/thbe/typewritten.git dest: /home/{{ item }}/.oh-my-zsh/custom/themes/typewritten loop: "{{ local_user }}" # Deploy zsh configuration file to all users defined in local_user (group_vars/all.yml) - name: Deploy local zsh user configuration - .zshrc copy: src: user/.zshrc dest: /home/{{ item }}/.zshrc owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" # Deploy plugin configuration files to all users defined in local_user (group_vars/all.yml) - name: Create .profile.d directory file: path: /home/{{ item }}/.profile.d state: directory owner: "{{ item }}" group: "{{ item }}" mode: 0750 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - alias.plugin.zsh copy: src: user/alias.plugin.zsh dest: /home/{{ item }}/.profile.d/alias.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - docker.plugin.zsh copy: src: user/docker.plugin.zsh dest: /home/{{ item }}/.profile.d/docker.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - functions.plugin.zsh copy: src: user/functions.plugin.zsh dest: /home/{{ item }}/.profile.d/functions.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - git.plugin.zsh copy: src: user/git.plugin.zsh dest: /home/{{ item }}/.profile.d/git.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - jekyll.plugin.zsh copy: src: user/jekyll.plugin.zsh dest: /home/{{ item }}/.profile.d/jekyll.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - nerd.plugin.zsh copy: src: user/nerd.plugin.zsh dest: /home/{{ item }}/.profile.d/nerd.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - puppet.plugin.zsh copy: src: user/puppet.plugin.zsh dest: /home/{{ item }}/.profile.d/puppet.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}" - name: Deploy local zsh user configuration - ruby.plugin.zsh copy: src: user/ruby.plugin.zsh dest: /home/{{ item }}/.profile.d/ruby.plugin.zsh owner: "{{ item }}" group: "{{ item }}" mode: 0640 loop: "{{ local_user }}"
Что делает эта задача? Во-первых, он создает идентификаторы пользователя в петле. Поэтому это выглядит вверх local_user
который определяется в group_vars All.yml
конфигурационный файл:
--- # Users that should be available on all target nodes local_user: - ansible - thbe
Каждый пользователь переносится в Предмет
переменная и процесс один за другим. Пользователь будет создан, пароль отключен (вместо этого мы будем использовать SSH-ключей), первичная оболочка устанавливается на ZSH, ключевые ключи для пользователей создаются, и пользователи добавляются в группу администратора.
Следующим шагом является то, что мой локальный открытый ключ будет добавлен в autorized_keys
каждого пользователя, чтобы я мог войти без пароля. Пользователи будут включены в /etc/sudoers
Конфигурация и, наконец, OH-My-ZSH будут установлены, а также мои предпочтительные тематики и последнее, но не менее важные, мои личные функции и псевдонимы.
Оригинал: «https://dev.to/thbe/harmonize-basic-set-up-with-ansible-part-2-27fg»