# Модули

# Общая информация

Модули - созданный на python скрипт, упрощающий конкретную задачу.

Модули возвращают значения, название модуля должно быть под name. Есть общие переменные и специфичные для модулей

Справка по модулю

```bash
ansible-doc apt
```

Список модулей

```bash
ansible-doc -l 
```

Пример проверки необходимости перезагрузки

```yaml
- name: check if reboot is required
  become: yes
  become_method: sudo
  shell: "[ -f /var/run/reboot-required ]"
  failed_when: False
  register: reboot_required
  changed_when: reboot_required.rc == 0
  notify: reboot
  
handlers:
- name: reboot
  command: shutdown -r now "Ansible triggered reboot after system updated"
  async: 0
  poll: 0
  ignore_errors: true
```

Ссылки

[Информация на русском языке о модулях](https://runebook.dev/ru/docs/ansible/-index-)

# Системные модули и скрипты

<details id="bkmrk-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8%2F%D0%B8%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2"><summary>Установка и/или проверка установки apt пакета</summary>

**Название модуля:** apt

**Переменные:**

- name: ntp #имя проверяемого и устанавливаемого модуля
- state: present #состояние после завершения
- update\_cache: yes # обновлять ли кэш

```yaml
- name: Install module
  apt: 
    name: ntp
    state: present
    update_cache: yes
```

</details><details id="bkmrk-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BA%D0%BB%D1%8E%D1%87-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD"><summary>Добавить ключ стороннего репозитория</summary>

```yaml
- name: Add Docker GPG key
  apt_key:
     url: https://download.docker.com/linux/ubuntu/gpg
```

</details><details id="bkmrk-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B8%D0%B9-%D1%80"><summary>Добавить сторонний репозиторий</summary>

```yaml
- name: Add Docker repository
  apt_repository:
    repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
```

</details><details id="bkmrk-%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-apt-%D0%BA%D1%8D%D1%88---n"><summary>Обновить apt кэш</summary>

```yaml
- name: Update apt cache
  apt: update_cache=yes
```

</details>---

<details id="bkmrk-%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C"><summary>Копирование файлов</summary>

Копирование с локального на удаленный

```yaml
- name: Copy from server to client
  copy:
    src: /home/user/file.txt 
    dest: /home/setup/file.txt
    owner: foo
    group: foo
    mode: '0644'
```

Копирование с удаленного на локальный

```yaml
- name: Copy from client to server
  fetch:
    src: /var/log/access.log
    dest: /var/log/fetched
    flat: true удалить структуру родительских папок для файла
```

</details>---

<details id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB"><summary>Создание пользователя и группы</summary>

Создание пользователя

```yaml
- name: Create and/or check presence user
  user:
    name: install
    state: present
    shell: /bin/bash
    group: sudo
    system: yes
    hidden: yes
    ssh_key_file: .ssh/id_rsa
    expires: -1
```

Создание группы

```yaml
- name: Create check group
  group:
    name: clustergroup
    state: present
    gid: 1040
```

</details><details id="bkmrk-%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0%D0%BC%D0%B8"><summary>Управление сервисами (daemon)</summary>

```yaml
- name: Update sysctl
  sysctl:
    name: net.ipv4.ip_forward
    value: 1
    sysctrl_set: yes
    state: present
    reload: yes   
```

```yaml
- name: Set or check service
  service:
    name: ntp
    state: started
    enabled: yes
```

```yaml
- name: Set check daemon starting
  systemd:
    name: ntp
    state: started
    enabled: yes
    masked: no
    daemon_reload: yes
    register: systemd
```

cron:

</details><details id="bkmrk-%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B-%D0%B8-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5"><summary>Скрипты и консольные команды</summary>

```yaml
- name: Raw command
  raw: echo "this was written by a raw Ansible module!!" >> ~/raw.txt
```

```yaml
- name: Executing script
  shell: ./shell_script.sh >> ~/shell.txt
    args:
    chdir: /usr/local/
    creates: ~/shell.txt
    executable: /bin/csh
```

```yaml
- name: Executing python script
  script: ./shell_script.py –some-argumets "42"
    args:
    creates: ~/shell.txt
    executable: python
```

Для исполнения expect скриптов нужно сначала проверить и установить пакет expect

```yaml
- name: Expect module
  expect:
    command: passwd user1
    responses:
    (?i)password: "Ju5tAn07herP@55w0rd":
```

</details>

# Git и pip

<details id="bkmrk-git---name%3A-clone-up"><summary>Git</summary>

```yaml
- name: Clone update repo
  git:
    repo: https://github.com/ansible/ansible.git
    dest: /usr/local/ansible
    clone: yes
    update: yes 
```

</details><details id="bkmrk-pip-%D0%98%D0%B7-%D0%BE%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-"><summary>Pip</summary>

Из официального репозитория:

```yaml
- name: Install python package
  pip:
     name: numpy
     version: 0.3
```

Из внешнего источника

```yaml
- name: install a python library from a github
  pip:
    name: https://github.com/jakubroztocil/httpie
```

</details>

# Docker

**Необходимые модули:**   
pip install 'docker-py&gt;=1.7.0'  
pip install 'docker-compose&gt;=1.7.0'  
ansible-container позволяет работать с docker без dockerfile

<details id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0-"><summary>Создание контейнера</summary>

```yaml
- name: create a container
  docker_container:
    name: debianlinux
    image: debian:9
    pull: yes
    state: present
```

</details><details id="bkmrk-%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0---"><summary>Запуск контейнера</summary>

```yaml
- name: start a container
  docker_container:
    name: debianlinux
    state: started
    devices:
      - "/dev/sda:/dev/xvda:rwm"
```

</details><details id="bkmrk-%D0%9E%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0"><summary>Остановка контейнера</summary>

```yaml
- name: stop a container
  docker_container:
    name: debianlinux
    state: stopped
```

</details><details id="bkmrk-%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0-%D0%B8%D0%B7-%D0%BB"><summary>Удаление образа из локального хранилища</summary>

```yaml
- name: remove a container image
    docker_image:
      name: labimages/ubuntu
      state: absent
      tag: lab16
```

</details><details id="bkmrk-%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-docke"><summary>Авторизация на docker hub</summary>

```yaml
- name: login to DockerHub
  docker_login:
    username: labuser1
    password: "L@bp@55w0rd"
    email: user1@lab.edu
```

</details><details id="bkmrk-%D0%A1%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7-%D0%B8%D0%B7-doc"><summary>Скачать образ из docker hub</summary>

```yaml
- name: pull a container image
    docker_image:
      name: ubuntu:18.04
      pull: yes
```

</details><details id="bkmrk-%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7-%D0%B2-do"><summary>Сохранить образ в docker hub</summary>

```yaml
- name: push a container image to docker hub
  docker_image:
    name: labimages/ubuntu
    repository: labimages/ubuntu
    tag: lab18
    push: yes
```

</details>