通过Ansible安装Apache

时间:2016-05-19 15:49:00

标签: amazon-web-services amazon-ec2 ansible ansible-playbook ansible-2.x

我试图通过Ansible在EC2实例上安装Apache。我的剧本看起来像这样:

# 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"

我确实看了一下:How to switch a user per task or set of tasks?但它似乎无法解决我的问题。

因为Ec2实例的配置是一个角色而Apache安装在另一个角色中,我是否以某种方式加强了安全性?

3 个答案:

答案 0 :(得分:2)

您遇到的问题是,运行这两种角色的Playbook都定位localhost,因此您的Apache角色正在尝试在本地运行sudo yum install httpd而不是在目标EC2实例上运行。

正如ec2 module docs示例所示,您需要使用add_host模块将新的EC2实例添加到您可以进一步播放的目标组中。

所以你的剧本可能看起来像这样:

# 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角色,帮助您重复使用你的代码。

答案 1 :(得分:0)

这是我安装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

答案 2 :(得分:0)

您确定您正确使用了ansible,并且为远程主机上的sudo设置了密码吗?

在执行剧本时只需使用--ask-become-pass。应该提示您输入密码。