Syntax highlighting of devops/ansible/playbooks

= Ansible Playbook =

<<TableOfContents(2)>>

## Полезные ссылки

[[https://docs.ansible.com/ansible/latest/user_guide/playbooks.html|Working with Playbooks|class=" moin-https"]]

## Пример

Сценарий представляет собой набор ''операций''. Операция - это ''словарь'', сценарий - ''массив''.

{{{#!highlight bash
# --- запуск сценария
ansible-playbook web-tls.myl

# --- запуск сценария с установкой переменной
ansible-playbook example.yml -e token=123456

# --- получение справки по модулю `service`
ansible-doc service
}}}


Плейбук:

{{{#!highlight yaml
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service:
      name: httpd
      state: started
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted

}}}

== operation ==

'''Состав операции'''

||Наименование || Описание ||
========================
||`name` || Комментарий, описывающий операцию. Выводится перед запуском||
||`hosts` || Список (группа) хостов||
||`become` || Если "истина", то операция выполняется "под root-ом"||
||`vars` || Список переменных и значений||
||`vars_files` || Список файлов переменных, напр. сюда можно поместить `secrets.yml`||

== vars ==

Определение переменных в конфигурации сценария:

{{{
vars:
  key_file: /some/file/nginx.key
  cert_file: /some/file/nginx.crt
  conf_file: /some/file/default
  server_name: localhost

}}}

Определение переменных через файл:

{{{
# some-playbook.yml
...
vars_files:
  - nginx.yml

# nginx.yml
key_file: /some/file/nginx.key
cert_file: /some/file/nginx.crt
conf_file: /some/file/default
server_name: localhost

}}}

Отладочный вывод переменных

{{{
- debug: var=myvarname

}}}

Регистрация переменных. В переменной ''login'' будет содержаться хэш с полями: ''changed, cmd, rc, stderr, stdout'' и прочими.

{{{
- name: show return value of command module
  hosts: server1
  tasks:
    - name: capture output of id command
      command: id -un
      register: login
    - debug: var=login
    # - debug: msg="Logged in as user {{ login.stdout }}"

}}}

Параметризация `hosts`

[[https://stackoverflow.com/questions/33222641/override-hosts-variable-of-ansible-playbook-from-the-command-line|source|class=" moin-https"]]

{{{
- hosts: '{{ host }}'
  tasks:
    - debug: msg="Host is {{ ansible_fqdn }}"

}}}

{{{
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"

}}}

== cycles ==

{{{
- name: install apt packages
  apt: pkg={{ item }} update_cache=yes cache_valid_time=3600
  become: True
  with_items:
    - git
    - libjpeg-dev
    - libpq-dev
    - nginx
    - ...

}}}

Альтернатива через список переменных

{{{
- name: Install a list of packages
  apt:
    name: "{{ packages }}"
  vars:
    packages:
    - foo
    - foo-tools

}}}

== recipes ==

Создание символической ссылки на файл

{{{
- name: enable the nginx file
  file:
    src: /etc/nginx/sites-available/domain.conf
    dest: /etc/nginx/sites-enabled/domain.conf
    state: link
  become: True

}}}

'''Отложенный ''gather_facts'''''

Может потребовать отложить запуск ''gather_facts'' в случаях, когда например на целевой системе не установлен python, но по ходу сценария требуется обратиться к переменным из фактов.

{{{
...
gather_facts: False
tasks:
  - name: do raw 1
  - name: do raw 2
  # получения фактов и системе
  - setup:
  - name: do command
  - ...

}}}