本文的示例代码参考env-php
目录
Vagrant
vim Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.host_name = "web"
config.vm.network "private_network", ip: "192.168.56.200"
config.vm.provider "virtualbox" do |vb|
vb.name = "web"
vb.cpus = "1"
vb.memory = "1500"
end
config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/id_rsa.pub"
config.vm.provision "shell", inline: <<-SHELL
cat /home/vagrant/.ssh/id_rsa.pub >> /home/vagrant/.ssh/authorized_keys
SHELL
end
vagrant up
ssh vagrant@192.168.56.200
关于Vargrant更多介绍 可以参考Vagrant简介
Ansible
vim Pipfile
[[source]]
verify_ssl = true
url = "https://mirrors.aliyun.com/pypi/simple"
name = "pypi"
[requires]
python_version = "3.7"
[packages]
ansible = "*"
[dev-packages]
pipenv install
pipenv run ansible --version
关于Ansible更多介绍 可以参考Ansible简介
Prepare
- .gitignore
gi python >> .gitignore
echo '.vagrant' >> .gitignore
echo '*.log' >> .gitignore
- inventory
mkdir inventory
vim inventory/hosts
[vagrant]
web ansible_host=192.168.56.200
- config
vim ansible.cfg
[defaults]
inventory = ./inventory/hosts
private_key_file = ~/.ssh/id_rsa
host_key_checking = False
pipenv run ansible vagrant -u vagrant -m command -a 'hostname'
# web | CHANGED | rc=0 >>
# web
Role
pipenv run ansible-galaxy init init --init-path=roles
vim roles/init/tasks/main.yml
---
- name: update source list
copy:
src: sources.list
dest: /etc/apt/sources.list
owner: root
group: root
mode: 0644
- name: add user
user:
name: "{{ ops_user['name'] }}"
groups: sudo
state: present
createhome: yes
- name: add sudoer
template:
src: sudoers.j2
dest: /etc/sudoers.d/{{ ops_user['name'] }}
validate: 'visudo -cf %s'
mode: 0440
- name: add authorized key
authorized_key:
user: "{{ ops_user['name'] }}"
key: "{{item}}"
with_file:
- ~/.ssh/id_rsa.pub
- name: create site dir
file:
path: "{{ ops_user['site_dir'] }}"
state: directory
owner: "{{ ops_user['name'] }}"
group: "{{ ops_user['name'] }}"
mode: 0755
- name: create service dir
file:
path: "{{ ops_user['service_dir'] }}"
state: directory
owner: "{{ ops_user['name'] }}"
group: "{{ ops_user['name'] }}"
mode: 0755
vim roles/init/files/sources.list
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
vim roles/init/templates/sudoers.j2
{{ ops_user['name'] }} ALL=(ALL) NOPASSWD:ALL
vim roles/init/vars/main.yml
---
ops_user:
name: op
site_dir: /opt/sites
service_dir: /opt/services
Playbook
vim web.yml
---
- name: playbook web
hosts: "{{ variable_host | default('vagrant') }}"
roles:
- role: init
tags: init
become: yes
pipenv run ansible-playbook web.yml --list-tasks
pipenv run ansible-playbook web.yml -u vagrant
Vars
mkdir group_vars
vim group_vars/vagrant.yml
---
ops_user:
name: op
site_dir: /opt/sites
service_dir: /opt/services
vim roles/init/vars/main.yml
---
# vars file for init
PHP
mkdir group_vars
vim group_vars/vagrant.yml
---
ops_user:
name: op
site_dir: /opt/sites
service_dir: /opt/services
php:
version: 7.1.30
pipenv run ansible-galaxy init php --init-path=roles
vim roles/php/tasks/main.yml
---
- name: download tar - php
get_url:
url: "https://mirrors.sohu.com/php/php-{{ php['version'] }}.tar.gz"
dest: "{{ ops_user['service_dir'] }}"
- name: unarchive tar - php
unarchive:
src: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}.tar.gz"
dest: "{{ ops_user['service_dir'] }}"
copy: no
- name: apt install - php
become: yes
apt: pkg={{ item }} update_cache=yes cache_valid_time=3600
with_items:
- build-essential
- libxml2-dev
- openssl
- libssl-dev
- libcurl4-openssl-dev
- pkg-config
- libbz2-dev
- libmcrypt-dev
- libpng-dev
- libjpeg-dev
- libmagickwand-dev
- libmagickcore-dev
- libfreetype6-dev
- libreadline-dev
- libxslt-dev
- name: configure - php
args:
chdir: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}"
command: "./configure --prefix={{ ops_user['service_dir'] }}/php \
--with-config-file-path={{ ops_user['service_dir'] }}/php/etc \
--with-openssl \
--with-kerberos \
--with-xmlrpc \
--with-mysql-sock \
--with-mysqli \
--with-mcrypt \
--with-mhash \
--with-pcre-regex \
--with-zlib \
--with-iconv \
--with-bz2 \
--with-curl \
--with-cdb \
--with-pcre-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-freetype-dir \
--with-gettext \
--with-libmbfl \
--with-onig \
--with-pdo-mysql \
--with-pdo-sqlite \
--with-readline \
--with-libxml-dir \
--with-xsl \
--with-pear \
--enable-fpm \
--enable-cgi \
--enable-soap \
--enable-bcmath \
--enable-calendar \
--enable-dom \
--enable-exif \
--enable-fileinfo \
--enable-filter \
--enable-ftp \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-json \
--enable-mbstring \
--enable-mbregex \
--enable-mbregex-backtrack \
--enable-pdo \
--enable-session \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--enable-zip \
--enable-mysqlnd-compression-support \
--enable-libxml \
--enable-inline-optimization \
--enable-opcache \
--enable-pcntl \
--enable-xml \
--enable-intl"
- name: make - php
make:
chdir: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}"
- name: make install - php
make:
chdir: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}"
target: install
- name: copy php.ini - php
copy:
remote_src: yes
src: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}/php.ini-production"
dest: "{{ ops_user['service_dir'] }}/php/etc/php.ini"
- name: config php.ini - php
command: "sed -i 's%;date.timezone =%date.timezone = \"Asia/Shanghai\"%g' {{ ops_user['service_dir'] }}/php/etc/php.ini"
- name: copy php-fpm.conf - php
copy:
remote_src: yes
src: "{{ ops_user['service_dir'] }}/php/etc/php-fpm.conf.default"
dest: "{{ ops_user['service_dir'] }}/php/etc/php-fpm.conf"
- name: config php-fpm.conf - php
command: "sed -i 's%;pid = run%pid = run%g' {{ ops_user['service_dir'] }}/php/etc/php-fpm.conf"
- name: copy www.conf - php
copy:
remote_src: yes
src: "{{ ops_user['service_dir'] }}/php/etc/php-fpm.d/www.conf.default"
dest: "{{ ops_user['service_dir'] }}/php/etc/php-fpm.d/www.conf"
- name: config www.conf - php
command: "{{item}}"
with_items:
- "sed -i 's%listen = 127.0.0.1:9000%listen = var/run/php-fpm.sock%g' {{ ops_user['service_dir'] }}/php/etc/php-fpm.d/www.conf"
- "sed -i 's%;listen.mode = 0660%listen.mode = 0666%g' {{ ops_user['service_dir'] }}/php/etc/php-fpm.d/www.conf"
- name: copy init.d.php-fpm - php
become: yes
copy:
remote_src: yes
src: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}/sapi/fpm/init.d.php-fpm"
dest: /etc/init.d/php-fpm
mode: 0755
- name: link bin/php - php
become: yes
file:
src: "{{ ops_user['service_dir'] }}/php/bin/php"
dest: /usr/bin/php
state: link
vim web.yml
---
- name: playbook web
hosts: "{{ variable_host | default('vagrant') }}"
roles:
- role: init
tags: init
become: yes
- role: php
tags: php
remote_user: "{{ ops_user['name'] }}"
pipenv run ansible-playbook web.yml --list-tasks
pipenv run ansible-playbook web.yml -u vagrant
Handlers
vim roles/php/tasks/main.yml
- name: copy init.d.php-fpm - php
become: yes
copy:
remote_src: yes
src: "{{ ops_user['service_dir'] }}/php-{{ php['version'] }}/sapi/fpm/init.d.php-fpm"
dest: /etc/init.d/php-fpm
mode: 0755
notify: start php-fpm
vim roles/php/handlers/main.yml
---
- name: start php-fpm
command: /etc/init.d/php-fpm start
Files
vim roles/php/tasks/main.yml
- name: copy composer
become: yes
copy:
src: composer
dest: /usr/bin/composer
owner: "{{ ops_user['name'] }}"
group: "{{ ops_user['name'] }}"
mode: 0755
notify: update composer source
vim roles/php/handlers/main.yml
- name: update composer source
command: composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
References
cd /opt/sites
composer create-project laravel/laravel laravel-test --prefer-dist "5.5.*" && cd laravel-test
php artisan serve
sudo apt install -y nginx
sudo vim /etc/nginx/sites-enabled/test.conf
server {
listen 80;
server_name 192.168.56.200.xip.io;
location / {
include fastcgi_params;
fastcgi_pass unix:/opt/services/php/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /opt/sites/laravel-test/public/index.php;
}
}
sudo nginx -t
sudo nginx -s reload
网友评论