This project will help you to deploy your Laravel project to your VPS without a headache it contains by default PHP - MySql - Redis - Nginx
I suffered a lot while migrating my code base from VPS to another, I migrated my code base like 20 times between different servers then I had to automate the process to save my time
currently I able to migrate from VPS to another in less than 5 minutes without any human interactions,
i update my
hosts.ini, run a single command
make apply then I bring my coffee, watch Ansible.
Pull my latest changes using a single command
is an open source software that automates software provisioning, configuration management, and application deployment.
There is no software or agent to be installed on the client that communicates back to the server.
No matter how many times you call the operation, the result will be the same.
Ansible is written in Python and uses YAML for playbook language, both of which are considered relatively easy to learn.
Installing and Running Ansible
# ubuntu sudo apt-get install ansible #mac-OS brew install ansible
For other OS check link
small programs that do some work on the server, so for example instead of running this command
sudo apt-get install htop
we can use apt module and install htop
- name: Install htop apt: name=htop
Using module give you the ability to know if it's installed or not.
Plugins are pieces of code that augment Ansible's core functionality. Ansible ships with a number of handy plugins, and you can easily write your own.
To provide a list of hosts, we need to provide an inventory list. This is in the form of a hosts file. In its simplest form, our hosts file could contain a single line:
Ansible playbooks are a way to send commands to remote computers in a scripted way. Instead of using Ansible commands individually to remotely configure computers from the command line, you can configure entire complex environments by passing a script to one or more systems.
file contains set of variables for example db username and password.
Roles are a way to group multiple tasks together into one container to do the automation in very effective manner with clean directory structures
Handlers are lists of tasks, not really any different from regular tasks, that are referenced by a globally unique name, and are notified by notifiers. If nothing notifies a handler, it will not run. Regardless of how many tasks notify a handler, it will run only once, after all of the tasks complete in a particular play.
If you have a large playbook it may become useful to be able to run a specific part of the configuration without running the whole playbook.
├── README.MD ├── MakeFile # file contains some aliases to get started quickly ├── .vault_pass.txt # file contains your vault config pass ├── ansible.cfg # contains ansible default config ├── code-deploy.yml # playbook to pull latest changes and deploy code ├── files # file contains sql_dump if you have one │ └── dump.sql ├── group_vars # file to store all your settings [ssh-keys,php_version,..etc] │ └── vars.yml ├── handlers # basic handlers to restart nginx || php-fpm │ └── main.yml ├── hosts.ini # file that contains your host IP ├── logs # this file contains error log details │ └── ansible-log.log ├── roles │ ├── bootstrap-app │ │ └── tasks │ │ └── main.yml │ ├── code-deploy │ │ ├── tasks │ │ │ ├── config-files.yml │ │ │ └── main.yml │ │ └── templates │ │ └── env.conf │ ├── misc │ │ └── tasks │ │ └── main.yml │ ├── mysql │ │ └── tasks │ │ ├── config.yml │ │ └── main.yml │ ├── nginx │ │ ├── tasks │ │ │ └── main.yml │ │ └── templates │ │ └── nginx.conf │ ├── php │ │ └── tasks │ │ └── main.yml │ └── redis │ └── tasks │ └── main.yml ├── scripts # some important scripts │ ├── install_composer.sh │ └── startup.sh └── site.yml # Main playbook to deploy all tasks
Before you start make sure you did these steps into your VPS you can add it as a startup script
#!/bin/sh sudo add-apt-repository ppa:deadsnakes/ppa -y sudo apt-get update sudo apt-get install -y python2.7 python3 python-pip
git clone https://github.com/ahmedfaragmostafa/Ansible-in-action.git
you have to ad you server id_rsa.pub to your github access keys by login to your instance and
ssh-keygen sudo chmod -R 644 .ssh/id_rsa cat .ssh/id_rsa.pub # add it to your git account
[aws] #your server IP 127.0.0.39
you have to define you config inside
#for example ansible_ssh_user: "ubuntu" current_user: "ubuntu" server_name: "your WebSiteName" repo_git_url: "you Repo" mysql_db: sql_db mysql_user: sql_user mysql_pass: "put_your_db_pass"
by default, all these configs will be populated to
have a look at
#first create .vault_pass.txt to save your key touch .vault_pass.txt echo 'YOUR_CONFIG_PASS' > .vault_pass.txt # encrypt your config make encrypt-vars # decrypt your config make decrypt-vars
If you encrypted your config don't forget to use
i added both options if you use any commands that start with
if you don't use vault use commands that don't have
#with vault pass make safe-apply # without make apply
make inside project dir you will get following tasks:-
Available tasks: encrypt-vars Encrypt your vars file decrypt-vars Decrypt your vars file apply Deploy your changes into your hosts safe-apply Deploy your changes into your hosts using vault pass code-deploy Pull latest changes safe-code-deploy Pull latest changes with vault pass update-config Update your env file safe-update-config Update your env file with vault pass
# RUN PLAY BOOK make apply #to pull latest changes make code-deploy # run specific tag make apply --tags="php" -vv #install specfic tag make apply --tags="php" -vv #update config files make update-config