28 февр. 2017 г.

ansible: запрос значения переменных

В некоторых случаях требуется ручной ввод переменных. Это можно сделать с помощью параметра vars_prompt.
- name: get host info
  hosts: localhost
  vars_prompt:
    - name: remote_host
      prompt: "Where to go? Enter DNS/IP"
      private: no
      default: localhost
    - name: remote_user
      prompt: "Enter remote username"
      private: no
      default: root
    - name: remote_user_pass
      prompt: "Enter password"
      private: yes 
Описание довольно очевидно, из интересностей: private: yes скрывает вводимые символы в консоли (аналогично поведению при вводе пароля при логине); значение default подставляется в случае, если ввод был пустым (также оно отображается в скобках при запросе значения). 
В качестве примера использования можно предложить такое задание:
tasks:
    - name: create dynamic inventory
      add_host:
        name: "{{ remote_host }}"
        groups: temp_hosts
        ansible_user: "{{ remote_user }}"
        ansible_become: yes
        ansible_ssh_pass: "{{ remote_user_pass }}"
        ansible_sudo_pass: "{{ remote_user_pass }}"

21 февр. 2017 г.

ansible: list of facts to file

В последнее время активно работаю с системой управления конфигурациями Ansible, поэтому есть что записать. 
Одна из последних задач: получить список хостов, удовлетворяющий заданному условию. В моем случае нужно было отобрать серверы, у которых в перечне используемых файловых систем есть устаревшая ext2. Информация о смонтированных файловых системах есть в автоматически собираемых фактах (gather_facts: yes в ansible.cfg или описании плейбука), поэтому каких-то дополнительных действий на хосте собирать не нужно.
Чуть усложнило ситуацию то, что элемент ansible_mounts представляет собой не словарь, как большинство элементов, возвращаемых модулем setup, а массив. Таким образом, для получения, к примеру, точки монтирования, требуется использовать не ansible_mounts.fstype, а ansible_mounts[0].fstype, причем количество элементов этого массива будет уникальным для каждого хоста. 
Решением такой задачи будет плейбук следующего вида:
- name: Check hosts for ext2fs available
  hosts: all
  gather_facts: yes
  tasks:
    - name: create list of files with ext2fs partitions
      shell: "echo {{ansible_fqdn|quote}},{{item.mount|quote}},{{item.fstype|quote}}, >> ./ext2fs_list_`date +%s`.csv"
      args:
        chdir: /tmp/
      delegate_to: localhost
      with_items: "{{ ansible_mounts }}"
      when: item.fstype == "ext2"
Если исключить атрибут when: , в файл будут записаны все найденные точки монтирования.

17 февр. 2017 г.

usermod -p

Для тестовых целей может потребоваться образ linux-а с предустановленным паролем root. При создании такого образа (через Docker, Vagrant, установочные скрипты) можно воспользоваться командой 
# usemod -p encrypted_password root
Чтобы получить шифрованное значение пароля
# openssl passwd my_pass