Установка Apache через Ansible

Я пытаюсь установить Apache на экземпляр EC2 через Ansible. Моя playbook выглядит так:

# Configure and deploy Apache
- hosts: localhost
  connection: local
  remote_user: ec2-user
  gather_facts: false
  roles:
    - ec2_apache
    - apache

Роль ec2_apache предоставляет экземпляр EC2, и первая задача в apache / main.yml выглядит так:

- name: confirm using the latest Apache server
  become: yes
  become_method: sudo
  yum: 
    name: httpd 
    state: latest

Однако я получаю следующую ошибку:

"module_stderr": "sudo: a password is required\n"

Я взглянул на: Как переключить пользователя на задачу или набор задач?, но, похоже, это не решило мою проблему.

Поскольку конфигурация экземпляра Ec2 находится в одной роли, а установка Apache - в другой, я каким-то образом нарушил безопасность?


person Perry Hoekstra    schedule 19.05.2016    source источник
comment
Нужен ли вам пароль при использовании sudo, когда вы находитесь на экземпляре как ec2-user?   -  person ydaetskcoR    schedule 19.05.2016
comment
Нет, если я подключу ssh к только что созданному экземпляру, я могу выполнить базовую команду «sudo ls / etc». Это то, что меня озадачило. Все примеры, которые я нашел в Интернете и через StackOverflow, не касаются создания EC2, а ТОГДА установка некоторой части программного обеспечения или, по крайней мере, в рамках отдельных ролей.   -  person Perry Hoekstra    schedule 19.05.2016


Ответы (3)


Проблема в том, что ваша книга, в которой выполняются обе роли, нацелена на localhost, поэтому ваша роль Apache пытается запускать sudo yum install httpd локально, а не на целевом экземпляре EC2.

Как показывает пример документации модуля ec2, вам необходимо использовать add_host, чтобы добавить ваш новый экземпляр (ы) EC2 в группу, на которую вы затем можете настроить таргетинг для дальнейшего воспроизведения.

Итак, ваш playbook может выглядеть примерно так:

# Configure and deploy Apache
- name: provision instance for Apache
  hosts: localhost
  connection: local
  remote_user: ec2-user
  gather_facts: false
  roles:
    - ec2_apache

- name: install Apache
  hosts: launched
  remote_user: ec2-user
  roles:
    - apache

А затем, в соответствии с примером в документации модуля ec2, просто сделайте что-то вроде этого в своей роли ec2_apache:

- name: Launch instance
  ec2:
     key_name: "{{ keypair }}"
     group: "{{ security_group }}"
     instance_type: "{{ instance_type }}"
     image: "{{ image }}"
     wait: true
     region: "{{ region }}"
     vpc_subnet_id: subnet-29e63245
     assign_public_ip: yes
  register: ec2

- name: Add new instance to host group
  add_host: hostname={{ item.public_ip }} groupname=launched
  with_items: ec2.instances

- name: Wait for SSH to come up
  wait_for: host={{ item.public_dns_name }} port=22 delay=60 timeout=320 state=started
  with_items: ec2.instances

Кстати, вы можете быстро увидеть, что ваша ec2_apache роль на самом деле является довольно общей, и вы можете превратить ее в общую ec2_provision роль, которую могли бы использовать всевозможные другие вещи, помогая вам повторно использовать ваш код.

person ydaetskcoR    schedule 19.05.2016
comment
Я попробовал, но радости не было. В обоих случаях я вижу следующее: fatal: [xxx.xxx.xx.xx]: FAILED! = ›{Изменено: false, failed: true, module_stderr: sudo: требуется пароль \ n, module_stdout:, msg: MODULE FAILURE, parsed: false} где 'xx.xxx.xx.xxx' - это экземпляр EC2, которым я являюсь пытается общаться с. Означает ли это, что Ansible работает с правильным хостом EC2? - person Perry Hoekstra; 19.05.2016

Вот что я сделал для установки apache. Основываясь на предложении @ydaetskcoR, все, что я добавил, - это подключение: локальное, чтобы исправить следующие проблемы.

Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password,keyboard-interactive).", "unreachable": true}

См. Код ниже

---
- name: Install Apache and other packages
  hosts: localhost
  become: yes
  connection: local
  gather_facts: false

  tasks:
  - name: Install a list of packages with a list variable
    yum:
      name: "{{ packages }}"
      state: latest
    vars:
      packages:
      - httpd
      - httpd-tools
      - nginx
    register: result

вам также необходимо запустить свой код следующим образом: -K означает --ask-become-pass

ansible-playbook -i hosts.ini startapache.yml -K -vvv
person Steven Keller    schedule 06.11.2020

Вы уверены, что правильно используете ansible и предоставляете ли вы пароль для sudo на удаленном хосте?

Просто используйте --ask-стать-pass при выполнении playbook. Вам будет предложено ввести пароль.

person user2977023    schedule 18.11.2020