我试图通过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安装在另一个角色中,我是否以某种方式加强了安全性?
答案 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。应该提示您输入密码。