Этот пост был первоначально опубликован в 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»