I've setup two vagrant VMs of ubuntu - one for slave and one for master.I frequently get confused after logging into the vagrant VM using vagrant ssh which machine I'm in. What do I call this green string in the screenshot and how do I change this this for both slave and master machines like ubuntuslave and ubuntumaster?
The string in green is of the format <username>#<hostname>. So in order to differentiate between your two servers, you need to change the hostname, to give you something like ubuntu#ubuntu-slave.
To do this, you need to add the hostname configuration option to your Vagrantfile:
Vagrant.configure("2") do |config|
config.vm.box = "precise32"
config.vm.hostname = "ubuntu-slave"
config.vm.network :private_network, ip: "192.168.0.10"
end
This, however, will only update your hostname after you recreate the VMs. If you aren't planning on doing this, you will also need to modify the hostname within Ubuntu itself.
Related
I am here because I've found different problems setting up SSH using this guide proposed in this other question.
First of all I've a computer (I want to use it as master) called: timmy#timmy-Lenovo-G50-80. My other computer is a Virtual Machine always with linux mint called: test#test-VirtualBox and I'd like to use it as a slave.
What I've done until now is:
install needed packets (both PC):
sudo apt-get install openssh-server openssh-client
Change inside the file /etc/ssh/sshd_config: (Only master)
the port of server from 22 to 2222
set PubkeyAuthentication yes (so no change)
remove comment at line: Banner /etc/issue.net
STOP
I am stuck when I've to execute this command:
ssh-copy-id username#remotehost
I imagine, reading what's written, that I've to execute something like:
ssh-copy-id timmy#timmy-Lenovo-G50-80
but:
from timmy#timmy-Lenovo-G50-80 everything goes OK, I can connect to myself (not what I actually want)
from test#test-VirtualBox it tells me ERROR: ssh: Could not resolve hostname timmy#timmy-Lenovo-G50-80: Name or service not known
Finally, what I've to do in order to connect these 2 PC?
You need to enable port forwarding into your VirtualBox'ed machine. Simply right click on the virtual machine, then go into Network. Then click on advance which will expand the Network window, and then on the button that appeared labeled Port forwarding.
A table will appear with several columns (Name, Protocol, Host IP, Host Port, ...). Simply add a new entry for protocol TCP, host port = X and guest port = 22 (see the list of well-known ports here https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports). The screenshot below is from my cloudera quickstart VM. Notice the outlined entry in the port forwarding rules, which is about setting up the SSH port in the guest OS.
Once you reboot the virtual machine, you can simply connect to it through
# ssh -p X localhost
the -p parameter tells to connect through the port X. Notice that if you want to use scp then you have to use the uppercase -P option rather than the lowercase -p.
# scp -P X localfile localhost:remote-dir/
As a disclaimer I am rather new to Linux after recently moving the Microsoft .NET IIS stack
The problem: I am having difficulty provisioning a ready made environment to develop against using the following...
Vagrant
Chef
VirtualBox
Apt (cookbook)
Apache2 (cookbook)
The error I am receiving is (when hitting the hostname or IP of the virtual machine)
ERR_NAME_NOT_RESOLVED
There is a lot of code so, I will just post my vagrant file and role...
Vagrantfile
-----------------
Vagrant.configure(2) do |config|
config.vm.box = "hashicorp/precise32"
config.vm.network :forwarded_port, guest: 80, host: 4567
config.vm.host_name = "www.example.vm"
config.vm.provision "chef_solo" do |chef|
chef.cookbooks_path = "cookbooks"
end
end
vagrant-test-boc.rb
-----------------
# Name of the role should match the name of the file
name "vagrant-test-box"
# Run list function we mentioned earlier
run_list(
"recipe[apt]",
"recipe[apache2]"
)
Any suggestions, guidelines examples would be most welcome!
Thanks!
Additional Edit: I have been advised to look into setting up an NGINX server using similar techniques, would this be another question or would it be valid along this thread?
My main resources have been....
https://adamcod.es/2013/01/15/vagrant-is-easy-chef-is-hard-part2.html
https://docs.vagrantup.com/v2/provisioning/chef_solo.html
If I understand correctly, you're trying to access the server www.example.vm (on port 4567) from your host ?
If that's the case, then the issue is probably that you've not told your host that www.example.vm is really an alias to your own host (localhost). Otherwise your host has no way of knowing that it shouldn't do a dns lookup and attempt to send a request to this host over the internet.
On a Unix / OSX box, you can edit your /etc/hosts, where you can add your fake domain name to the localhost line, like so:
127.0.0.1 localhost www.example.vm
Hope this helps! ; )
TL&DR: Is there a way to force a proxy VM to be used by Vagrant, even if the host OS supports Docker natively?
I'm using Vagrant with Docker provider. The Vagrant VM is the OS and Docker containers host my apps (web servers, DBs).
Problem:
Linux containers do not run natively on non-Linux machines. If your
developers are on Mac or Windows, they can't run Docker containers
natively. Vagrant detects these cases and automatically spins up a
Linux virtual machine to run the Docker containers.
[...]
If Vagrant is being used with Docker on Linux, Vagrant won't
automatically spin up a virtual machine and instead will run Docker
natively
Source: http://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html
It's great that Vagrant automatically spin up a proxy VM for OS that doesn't support natively Docker, because they so have the same OS to work with.
But for Linux hosts, we're stuck with native Docker installation, which cause few problems:
file/folder permission
different user for different Linux OS (Apache user is sometime "apache", sometime "www", depending of your Linux distro)
Here is my Vagrant files for references:
DockerHost.Vagrantfile
Vagrant.configure("2") do |config|
config.vm.provision "docker"
config.vm.box = "ubuntu/trusty64"
config.vm.define "dockerhost"
config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.synced_folder "/sites", "/sites" [...]
config.vm.provider :virtualbox do |vb|
vb.name = "Vagrant-Dockerhost"
vb.memory = 1024 # => Required by MySQL Server
end
end
Vagrantfile
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
DOCKER_HOST_NAME = "dockerhost"
DOCKER_HOST_VAGRANTFILE = "DockerHost.Vagrantfile"
Vagrant.configure("2") do |config|
config.vm.define "mysql-server" do |v|
v.vm.provider "docker" do |d|
d.image = "mysql"
d.name = "mysql-server"
d.env = {
MYSQL_ROOT_PASSWORD: "rootpasswd",
MYSQL_USER: "mysqluser",
MYSQL_PASSWORD: "userpasswd",
MYSQL_DATABASE: "dev"
}
d.volumes = ["/mysql:/var/lib/mysql"]
d.cmd = ["/entrypoint.sh", "mysqld"]
d.remains_running = true
d.vagrant_machine = "#{DOCKER_HOST_NAME}"
d.vagrant_vagrantfile = "#{DOCKER_HOST_VAGRANTFILE}"
end
end
config.vm.define "apache-server" do |v|
v.vm.provider "docker" do |d|
d.image = "lacavalerie/apache-server"
d.ports = ["80:80"]
d.name = "apache-server"
d.link("mysql-server:db")
d.volumes = [...]
d.cmd = ["/scripts/setup.rb"]
d.remains_running = true
d.vagrant_machine = "#{DOCKER_HOST_NAME}"
d.vagrant_vagrantfile = "#{DOCKER_HOST_VAGRANTFILE}"
end
end
end
Just use d.force_host_vm = true option
From Vagrant docs:
force_host_vm (boolean) - If true, then a host VM will be spun up even
if the computer running Vagrant supports Linux containers. This is
useful to enforce a consistent environment to run Docker. This value
defaults to "true" on Mac and Windows hosts and defaults to "false" on
Linux hosts. Mac/Windows users who choose to use a different Docker
provider or opt-in to the native Docker builds can explicitly set this
value to false to disable the behavior.
My Problem:
I can only access my sites through port 8000, but not 80, which makes me think it is not redirecting 80 to 8000 as it says it should be. I want to simply type local.kujif.com into my browser and it loads the site, which I read was port 80 by default. I am using curl to check it and it returns:
curl 'http://local.kujif.com'
curl: (7) Failed connect to local.kujif.com:80; No error
However if I add :8000 to the url then it works; it returns my index.php which simply prints 'test':
curl 'http://local.kujif.com:8000'
test
My Details:
I am using Laravel Homestead and Vagrant with Oracle VM VirtualBox.
In the Homestead.rb it has the port forwarding. I haven't edited it at all:
config.vm.network "forwarded_port", guest: 80, host: 8000
config.vm.network "forwarded_port", guest: 3306, host: 33060
config.vm.network "forwarded_port", guest: 5432, host: 54320
I also have Microsoft IIS installed for my work stuff. I obviously stop that service whenever I need vagrant to use the localhost.
"vagrant up" shows:
My Homestead.yaml file:
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
authorize: /Users/Tyler/.ssh/id_rsa.pub
keys:
- /Users/Tyler/.ssh/id_rsa
folders:
- map: C:\DEV\Linux
to: /var/www/
sites:
- map: homestead.app
to: /home/vagrant/Code/Laravel/public
- map: local.kujif.com
to: /var/www/kujif
variables:
- key: APP_ENV
value: local
You should continue to use ports above 1024 since they are non-privileged ports, BUT if you do want you can run as port 80 on the Homestead VM, as long as you don't have anything holding on to that port on the host machine. Just tried it and it worked, with a few gotchas. First, you change that line in the .rb file from:
config.vm.network "forwarded_port", guest: 80, host: 8000
to
config.vm.network "forwarded_port", guest: 80, host: 80
When you fire your VM up after saving you will get a warning from vagrant:
==> default: You are trying to forward to privileged ports (ports <= 1024). Most
==> default: operating systems restrict this to only privileged process (typically
==> default: processes running as an administrative user). This is a warning in case
==> default: the port forwarding doesn't work. If any problems occur, please try a
==> default: port higher than 1024.
==> default: Forwarding ports...
default: 80 => 80 (adapter 1)
But it worked for me. Now, to actually get to the VM I had to use it's private IP instead of the localhost name:
http://192.168.10.10/
But sure enough my site was there and everything was working. If you decide to keep it that was you can add that IP address to your hosts file to give it a nice short name.
Hope this helps.
I see there is an accepted answer, but this alternative may also help someone.
If I understand correctly you really dislike the port "8000"!
Have you tried setting a private network?
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
/*other config stuff here */
config.vm.network :private_network, ip: "192.168.33.22"
This way you can simply use that IP address, or edit you hosts file to map the local domain to that IP.
Take a look at the Vagrant docs:Vagrant Private Networks
BTW, You shouldn't need to shutdown your IIS local server as that is running on a totally different IP range. I have Apache running locally while also accessing the VM server. This allows you to use tools like composer (to pull in laravel) on your local if needed.
I'm not sure what the confusion is - this is the way it's supposed to work.
The web server on the VM listens on port 80. Vagrant/VirtualBox forwards that port from 80 (on the VM) to 8000 (on localhost) so that you can access the site at http://localhost:8000.
Port 80 on the VM's domain name is not going to be available - that domain name probably resolves to localhost.
Try the following: dig local.kujif.com (or nslookup or even ping - I don't know what tools are available on Windows) to find out what IP address that name is resolving to. You will probably find that it's 127.0.0.1 (localhost).
You could try using the IP address set in the homestead file instead: http://192.168.10.10/ - this might work, but it will depend on how networking is configured in the VM.
Ideally, you need to set networking to "bridged" in the VM - this will make the VM look (to your network) like any other device on the network. Other networking options in the VM (sorry, I'm not familiar with the options in VirtualBox) will set the VM up with its own network that is not accessible outside the VM - this is why port forwarding is used to expose network services on the VM.
You can disable the default port forwarding completely by adding the following to the Homestead.yaml:
default_ports: false
Or configure however you like by adding something like:
ports:
- send: 80
to: 80
In my Vagrantfile I have the definition of my development machine with a private network ip of 192.168.33.10 and a forwarded port of "guest=80, host=8888", but when a run my vagrant enviroment and I try to run curl -i 192.168.33.10:8888 I get an error saying 'Failed connect to 192.168.33.10:8888; connection refused', but when I try to connect to 192.168.33.10:80 everything it's ok.
My Vagrantfile is:
Vagrant::configure("2") do |config|
config.vm.box = "precise32"
config.vm.define :web do |www|
www.vm.hostname = "apache"
www.ssh.max_tries = 10
www.vm.network :forwarded_port, guest: 80, host: 8888 # Apache port
www.vm.network :private_network, ip: "192.168.33.10"
www.vm.synced_folder "www", "/var/www", :extra => 'dmode=777,fmode=777'
end
end
Why this happens? is vagrant ignoring the forwarded port?
By default Vagrant Boxes use NAT mode, it means that the guests are behind a router (VirtualBox Networking engine between the host and the guest) which maps traffic from and to the virtual machine transparently. The guests are invisible and unreachable from the host.
That's why we need port forwarding. Otherwise services running on guest wont' be accessible.
In your case, you are using Private Network, the guest will be assigned a private IP address that ONLY the host can access, which is 192.168.33.10.
The proper way to access web hosted on the guest is => http://192.168.33.10 from the host.
You have the port forwarding part in the Vagrantfile
www.vm.network :forwarded_port, guest: 80, host: 8888 # Apache port
It is forwarding guest port 80 to your host's 8888. Because you are NOT using NAT mode I am pretty sure it will be ignored. Try to curl -Is http://localhost:8888.
NOTE: even if it still work somehow, you should be accessing web by => http://localhost:8888/ from your host.