Файлы и каталоги
Создание файла с указанием владельца и разрешений
- 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.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