it-swarm.com.ru

В Ansible, возможно ли определить метод аутентификации для каждой книги?

TL; DR: возможно ли связать две книги воспроизведения одной командой ansible-playbook, где одна книга воспроизведения является аутентификацией по паролю, а другая книга воспроизведения - аутентификацией по ключу? (см. последний раздел для реальных целей).

Настроить:

У меня есть две пьесы, вторая из которых includes первая.

PlaybookA.yml

---
- name: PlaybookA # requires password authentication
  hosts: sub.domain.ext
  remote_user: root
  roles:
    - { role: role1, Sudo: yes }
...

PlaybookB.yml

---
- name: Run PlaybookA
  include: PlaybookA.yml

- name: PlaybookB # requires ssh-key authentication
  hosts: sub.domain.ext
  remote_user: ansible
  roles:
    - { role: role2, Sudo: yes }
...

Требования:

  1. Выполнить только одну команду.
  2. Используйте пароль аутентификации для PlaybookA.
  3. Используйте ssh-ключ авторизации для PlaybookB.

Вопрос 1:

Возможно ли в Ansible (версии 1.9.4 или ниже) выполнить одну команду ansible-playbook, которая успешно выполнит PlaybookB с использованием аутентификации ssh-key, но когда PlaybookB включает PlaybookA, запустите PlaybookA с использованием аутентификации по паролю?

Вопрос 2:

Если это невозможно с Ansible 1.9.4 или ниже, возможно ли это с 2.0.0+?

Примечания стоит:

  1. Ansible предоставляет --ask-pass (или -k) в качестве параметра командной строки, обеспечивающего аутентификацию по паролю.
  2. Ansible предоставляет ask_pass как переменную, но кажется, что она может быть установлена ​​только внутри ansible.cfg (я не смог установить это как переменную playbook для желаемого эффекта).
  3. Попытка установить ask_pass в качестве инструкции в книге воспроизведения приводит к следующему: ERROR: ask_pass is not a legal parameter of an Ansible Play. Если бы этот параметр был допустимым, он предоставил бы способ указать ansible на уровне каждой книги, какой метод аутентификации использовать.

Цель/Реальный Мир:

Я пытаюсь создать рабочий процесс управления конфигурацией с Ansible, который будет достаточно простым, чтобы другие на работе могли учиться/адаптироваться к нему (и, надеюсь, использовать Ansible в целом для CM и оркестровки).

Для любой новой машины (виртуальной или физической), которая будет построена, я намереваюсь немедленно запустить две пьесы. PlaybookA (как показано выше) отвечает за вход в систему с правильным пользователем по умолчанию (обычно зависит от инфраструктуры [aws, vsphere, none и т.д.]). Однажды, его очень ограниченная работа состоит в том, чтобы:

  1. Создайте стандартизированного пользователя для ansible для запуска от имени (и установите его ssh-ключ).
  2. Удалите всех пользователей без полномочий root (артефакты инфраструктуры vm и т.д.).
  3. Отключить root-доступ.
  4. Отключить аутентификацию по паролю (ssh-ключ только с этого момента).

В зависимости от инфраструктуры vm (или ее отсутствия) пользователь по умолчанию или метод аутентификации по умолчанию могут отличаться. Что касается цели принятия Ansible, я пытаюсь сделать вещи максимально простыми для коллег, поэтому я хотел бы автоматизировать как можно большую часть этого управления потоком.

Как только PlaybookA заблокирует виртуальный компьютер и настроит стандартизированного пользователя, PlaybookB использует этого стандартизированного пользователя для выполнения всех других операций, необходимых для приведения нашего виртуального компьютера в соответствие с необходимыми базовыми инструментами и утилитами и т.д.

Любые советы, подсказки, предложения будут с благодарностью.

8
Informatician

Я столкнулся с той же проблемой сегодня. Здесь вам могут помочь две идеи: Вы можете запросить пароль, используя vars_Prompt в вашей книге игр вместо --ask-pass Установите пароль с помощью set_fact:


- name: "set password for the play"

  set_fact: ansible_ssh_pass="{{ my_pass }}"

Вы можете сохранить пароль в файле или запросить его, как в примере ниже. В моем примере создаваемая конфигурация sshd запрещает вход в систему с паролем, но при использовании заданных по умолчанию значений, вы будете удивлены, что вторая книга воспроизведения все равно будет выполнена (!), Даже если я «забыл» создать author_keykey. Это связано с тем, что ansible использует параметры ControlPersist ssh и просто поддерживает связь между отдельными задачами. Вы можете отключить это в ansible.cfg

Пример Playbook:


- name: "MAKE BARE: Run preparatory steps on a newly acquired server"
  hosts: blankee

  tasks:
    - name: "set password for the play"
      set_fact: ansible_ssh_pass="{{ my_pass }}"

    - name: "Create directory {{ pathsts }}/registry/ansible-init"
      file: name="{{ pathsts }}/registry/ansible-init" state=directory owner=root group=www-data mode=770

    - name: "copy sshd config file"
      copy:
        src:    'roles/newhost/files/sshd_config'
        dest:   '/etc/ssh/sshd_config'
        owner:  'root'
        group:  'root'
        mode:   '0644'


    - name: "Check syntax of sshd configuration"
      Shell: sshd -t
      register: result
      changed_when: false
      failed_when: "result.rc != 0"

    - name: "Restart SSHD and enable Service to start at boot"
      service: name=sshd state=restarted
      changed_when: false

  vars:
    my_pass2: foobar

  vars_Prompt:
    - name: "my_pass"
      Prompt: "########## Enter PWD:\n "



- name: "Second run: This should authenticate w/out password:"
  hosts: blankee

  tasks:

    - name: "Create directory {{ pathsts }}/registry/ansible-init"
      file: name="{{ pathsts }}/registry/ansible-init22" state=directory owner=root group=www-data mode=770
6
mulleto

Я не знаю, как изменить метод аутентификации в игре. Я думаю, что я предпочел бы запускать две разные пьесы как задание Дженкинса или подобное, но я могу придумать простой обходной путь Ansible: вместо включения второй пьесы вы можете получить команду запуска команды Shell в качестве локального действия и запуска Команда выполнить вторую пьесу из первой. Вот грубое доказательство концепции:

---
- hosts: all
  vars_files:
    - vars.yml
  tasks:
    - debug: msg="Run your first role here."

    - name: Then call Ansible to run the second playbook.
      local_action: Shell ansible-playbook -i ~/workspace/hosts ~/workspace/second_playbook.yml
      register: playbook_results

    - debug: var=playbook_results.stdout_lines

Вот вывод:

GATHERING FACTS *************************************************************** 
ok: [vagrantbox]

TASK: [debug msg="Run your first role here."] ********************************* 
ok: [vagrantbox] => {
    "msg": "Run your first role here."
}

TASK: [Then call Ansible to run the second playbook.] ************************* 
changed: [vagrantbox -> 127.0.0.1]

TASK: [debug var=playbook_results.stdout_lines] ******************************* 
ok: [vagrantbox] => {
    "var": {
        "playbook_results.stdout_lines": [
            "", 
            "PLAY [Proof of concept] ******************************************************* ", 
            "", 
            "GATHERING FACTS *************************************************************** ", 
            "ok: [vagrantbox]", 
            "", 
            "TASK: [debug msg=\"This playbook was called from another playbook!\"] *********** ", 
            "ok: [vagrantbox] => {", 
            "    \"msg\": \"This playbook was called from another playbook!\"", 
            "}", 
            "", 
            "PLAY RECAP ******************************************************************** ", 
            "vagrantbox                 : ok=2    changed=0    unreachable=0    failed=0   "
        ]
    }
}

PLAY RECAP ******************************************************************** 
vagrantbox                 : ok=4    changed=1    unreachable=0    failed=0   
0
nikobelia