15 июня 2022 г.
1590

Примеры tasks playbook Ansible для Linux

Файлы и каталоги

Создание файла с указанием владельца и разрешений
- name: Создание файла
  file:
    dest: /home/file.txt
    state: touch
    owner: root
    group: root
    mode: 0644
Создание каталога
- name: Создание каталога
  file:
    dest: /home/dir1
    state: directory
    owner: root
    group: root
    mode: 0644
Удаление файла
- name: Удаление файла
  file:
    path: /home/ansible/sample_file.txt
    state: absent
Изменение разрешений файла
- name: Изменение разрешений файла
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'
Копирование файла с указанием владельца и разрешений
При этом дерево каталогов будет следующим
playbook
  files
    src_file.txt
  main.yaml
- name: Копирование файла
  copy:
    src: src_file.txt
    dest: /home/file.txt
    owner: root
    group: root
    mode: 0644
Копирование каталога с указанием владельца и разрешений
При этом дерево каталогов будет следующим
playbook
  files
    dir1
      src_file.txt
  main.yaml
- name: Копирование каталога
  copy:
    src: files/dir1
    dest: /home/file.txt
    owner: root
    group: root
    mode: 0644
Копирование файла из шаблона с указанием владельца и разрешений, переменные файла .j2 в формате "{{ value }}" заменятся на их значения
При этом дерево каталогов будет следующим
playbook
  templates
    src_file.txt.j2
  main.yaml
- name: Копирование файла из шаблона
  template:
    src: templates/src_file.txt.j2
    dest: /home/file.txt
    owner: root
    group: root
    mode: 0644

Yum

Обновление имеющихся пакетов до последних версий
- name: Обновление всех пакетов до последних версий
  yum:
    name: '*'
    state: latest
Установка пакета vim
- name: Установка пакета vim
  yum:
    name: vim
    update_cache: true
    state: present
Установка нескольких пакетов
- name: Установка нескольких пакетов
  yum:
    name: 
      - vim
      - nginx
      - mariadb-server
    update_cache: true
    state: present
Установка нескольких пакетов
- name: Установка нескольких пакетов
  yum:
    name: "{{ package }}"
  vars:
    package:
    - mc
    - wget
    - tar
    state: latest
Установка rpm пакета с получением его по ссылке
- name: Установка rpm пакета с получением его по ссылке
  yum:
    name: https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.2/cri-dockerd-0.2.2.20220610195206.0737013-0.el7.x86_64.rpm
    update_cache: true
    state: present

Apt

Обновление всех установленных пакетов до последней версии
- name: Обновление всех установленных пакетов до последней версии
  apt:
    name: "*"
    update_cache: true
    state: latest
Установка пакета vim
- name: Установка пакета vim
  apt:
    name: vim
    update_cache: true
    state: present
Удаление пакета vim
- name: Удаление пакета vim
  apt:
    name: vim
    update_cache: true
    state: absent
Удаление ненужных зависимостей
- name: Удаление ненужных зависимостей
  apt:
    autoremove: yes
Скачивание пакета
- name: Скачивание пакета
  get_url:
    url: https://browser.yandex.ru/download/?linux=1&banerid=6301000000&zih=1&beta=1&os=linux&x64=1&package=deb&full=1
    dest: /home/
    mode: '0750'
Установка из deb пакета
- name: Установка из deb пакета
  apt:
    deb: /home/Yandex.deb
    update_cache: true
    state: present
Добавление репозитория с ключом
- name: Скачивание ключа
  get_url:
    url: https://apt.hyperion-project.org/hyperion.pub.key
    dest: /home/keys_repo/Hyperion-repokey.gpg
    mode: 0644
- name: Добавление ключа
  apt_key:
    file: /home/keys_repo/Hyperion-repokey.gpg
    state: present
- name: Добавление репозитория
  apt_repository:
    repo: deb [signed-by=/home/keys_repo/Hyperion-repokey.gpg] https://apt.hyperion-project.org/ stable main
    state: present
Добавление репозитория
- name: Добавление репозитория nginx с последней версией
  apt_repository:
    repo: deb http://archive.canonical.com/ubuntu {{ ansible_lsb.codename }} nginx
    state: present
- name: Добавление ключа репозитория
  apt_key:
    url: https://nginx.org/keys/nginx_signing.key
    state: present

Пользователи и группы

Создание пользователя
- name: Создание пользователя
  user:
    name: user123
    comment: Ansible user
    group: wheel
Удаление пользователя
- name: Удаление пользователя
  user:
    name: user123
    state: absent
    remove: yes
Создание пользователей по словарю из файла.
Пусть содержимое файла users.yaml будет следующим
users_dict:
  user1: pass1
  user2: pass2
  user3: pass3
vars_files:
  - users.yaml
tasks:
  - name: Создание пользователей по словарю из файла
      user:
        name: "{{ user.key }}"
        comment: "Ansible-generated user"
        password: "{{ user.value | password_hash('sha512') }}"
      no_log: true
      loop: "{{ lookup('dict', users_dict) }}"
      loop_control:
        loop_var: user
        pause: 5
Создание группы
- name: Создание группы
  group:
    name: group123
    state: present
Добавление пользователя в группу
- name: Добавление пользователя в группу
  user:
    name: user123
    groups: group123
    append: yes
Добавление строки NOPASSWD в /etc/sudoers группе wheel, для ubuntu изменить wheel на sudo
- name: Добавление строки NOPASSWD в /etc/sudoers группе wheel
  lineinfile:
    path: /etc/sudoers
    regexp: "^%wheel ALL="
    line: "%wheel ALL=(ALL) NOPASSWD: ALL"
    state: present
    validate: visudo -cf %s
Проброс публичного ключа пользователя с Ansible
- name: Проброс публичного ключа пользователя с Ansible
  authorized_key:
    user: user123
    state: present
    key: "{{ lookup('file', '/home/user123/.ssh/id_rsa.pub') }}"
    path: /home/user123/.ssh/authorized_keys
Вывод имени пользователя от которого работает playbook
- name: Вывод имени пользователя от которого работает playbook
  debug:
    var: ansible_user_id

Сервисы

Запуск и включение автозагрузки сервиса, если нужно, можно оставить что-то одно или запуск (state) или включение автозапуска (enabled)
- name: Запуск и включение автозагрузки сервиса
  service:
    name: nginx
    state: started
    enabled: true
Перезапуск сервиса
- name: Перезапуск сервиса
  service:
    name: nginx
    state: restarted 
daemon-reload
- name: daemon-reload
  systemd:
    daemon_reload: yes

Система

Выполнение произвольной команды, аргументы можно не указывать
- name: Выполнение команды с указанием каталога выполнения
  shell: echo 12345
  args:
    chdir: /root
Создание файла и запись в него
- name: Создание файла и запись в него
  shell: echo 12345 >> somefile.txt
  args:
    chdir: /root
    creates: file.txt
Отключение SELinux, для использования нужно установить коллекцию ansible-galaxy collection install ansible.posix
- name: Отключение SELinux до перезагрузки
  shell: setenforce 0
  ignore_errors: true #если уже выключено будет ошибка

- name: Полное отключение SELinux
  lineinfile:
    path: /etc/sysconfig/selinux
    regexp: "^SELINUX="
    line: "SELINUX=disabled"
Перезагрузка сервера
- name: Перезагрузка сервера
  shell: sleep 3 && shutdown -r now
    async: 1
    poll: 0
Ожидание запуска сервера
- name: Ожидание запуска сервера
  wait_for:
    host: "{{ inventory_hostname }}"
    state: started
    delay: 5
    timeout: 40
  delegate_to: localhost
В этой задаче произойдет перезагрузка сервера. После перезагрузки, через 30 секунд, будет попытка подключится к сервера и запустить тестовую команду whoami. Если не получится подключится в течении 5 секунд будут продолжаться попытки 600 секунд (10 минут)
- name: Перезагрузка хостов и ожидание их перезагрузки
  reboot:
    msg: "Reboot initiated by Ansible"
    connect_timeout: 5
    reboot_timeout: 600
    pre_reboot_delay: 0
    post_reboot_delay: 30
    test_command: whoami
Отключение swap
- name: Отключение swap
  shell: swapoff -a

- name: Полное отключение swap
  replace:
    path: /etc/fstab
    regexp: '^(\s*)([^#\n]+\s+)(\w+\s+)swap(\s+.*)$'
    replace: '#\1\2\3swap\4'
Проверка установлен или не установлен в системе пакет
- name: Возврат информации об установленных пакетах как факты
  package_facts:
    manager: "auto"

- name: Если nginx найден
  debug: 
    msg: "nginx установлен"
  when: "'nginx' in ansible_facts.packages"

- name: Если nginx не найден
  debug: 
    msg: "nginx не установлен"
  when: "'nginx' not in ansible_facts.packages"
Управление параметрами ядра
- name: sysctl modify
  sysctl:
    sysctl_file: /etc/sysctl.d/20-tcp-sack.conf
    name: net.ipv4.tcp_fastopen
    value: 1
    reload: yes
    state: present
    sysctl_set: yes
Пауза перед выполнением следующей задачи
- name: Пауза 5 минут
  pause:
    minutes: 5
Выполнить какую либо команду если установлен rpm пакет
- name: Проверка, установлен ли пакет
  yum:
    list: nginx
  register: yum_list

- name: Выполнить
  debug:
    msg: text
  when: yum_list.results | selectattr("yumstate", "match", "installed") | list | length != 0
Вывод массива в консоль через цикл
vars:
  numbers: [6, 5, 8, 1, 11]
tasks:
  - name: Вывод массива в консоль через цикл
    debug:
      msg: "{{ item_numbers }}"
    loop: "{{ numbers }}"
    loop_control:
      loop_var: item_numbers
    pause: 4

Файервол centos

Открытие http (80) порта
- name: Открытие http (80) порта
  firewalld:
    service: http
    permanent: yes
    state: enabled
Открытие https (443) порта
- name: Открытие https (443) порта
  firewalld:
    service: https
    permanent: yes
    state: enabled
Открытие tcp порта
- name: Открытие порта 10051 по TCP
  firewalld:
    port: 10051/tcp
    permanent: yes
    state: enabled
Открытие udp порта
- name: Открытие порта 10051 по UDP
  firewalld:
    port: 10051/udp
    permanent: yes
    state: enabled
Открытие нескольких портов
- name: Открытие портов
  firewalld:
    port: "{{ item }}"
    permanent: yes
    state: enabled
    loop:
      - 6443/tcp
      - 2379-2380/tcp
      - 10250/tcp
      - 10051/tcp
      - 10252/tcp
      - 10255/tcp
Перезапуск firewalld
- name: Перезапуск firewalld
  systemd:
    name: firewalld
    state: restarted
Применение конфигурации firewalld
- name: Перезапуск firewalld
  systemd:
    name: firewalld
    state: reloaded

Файервол ubuntu

Открытие порта
- name: Открытие порта 3389
  ufw:
    rule: allow
    port: '3389'
    proto: tcp