[stg_web] test-stg-web01 ansible_host=192.168.33.10 ansible_ssh_common_args='-o ProxyCommand="ssh -i ~/.ssh/test.pem -W %h:%p -q bastion-user@192.168.33.30"' [prod_web] test-prod-web01 ansible_host=192.168.33.20 ansible_ssh_common_args='-o ProxyCommand="ssh -i ~/.ssh/test.pem -W %h:%p -q bastion-user@192.168.33.30"'
カテゴリー: サーバ構築
【Nginx】Nginx での リバースproxy 設定
Nginx のリバースproxy 設定に関して纏めておきます。
例1
server {
listen 443 ssl;
server_name test.com www.test.com;
client_max_body_size 12m;
proxy_set_header Host $http_host;
ssl_certificate /etc/certs/test.com/current/test.com.pem;
ssl_certificate_key /etc/certs/test.com/current/test.com.key;
location / {
proxy_pass http://localhost:8008;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-HTTPS on;
proxy_set_header X-Forwarded-SSL on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}Nginx の443で受けてlocalの 8008 に渡す感じですね。
Nginx で ssl終端させる感じですね。
例2
server {
listen 443 ssl;
server_name www.test.com;
client_max_body_size 12m;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-HTTPS on;
proxy_set_header X-Forwarded-SSL on;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffer_size 32k;
proxy_buffers 50 32k;
proxy_busy_buffers_size 32k;
ssl_certificate /etc/certs/test.com/current/www.test.com.pem;
ssl_certificate_key /etc/certs/test.com/current/www.test.com.key;
location / {
proxy_pass https://192.168.33.10:443;
}
include /etc/nginx/proxy_virtual/www.test.com/*.conf;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
location ~ (\/api)(\/.*)?{
proxy_pass https://localhost:8008;
}/api でのアクセスであれば local の 8008 に proxy する設定ですね。
それ以外は https://192.168.33.10:443 に proxy させます。
※ L7 での proxy ですね。
【Ansible】AnsibleでAWSのネットワークを構築する【IaC】
Terraform に埋もれがちですが Ansible でも AWS のリソース構築が出来るんですよね。
作るもの
・VPC
・public subnet x 2
・private subnet x 2
・internet gateway
・route table
ディレクトリ構造
├── README.md ├── ansible.cfg ├── hosts ├── roles │ └── aws_vpc │ ├── tasks │ │ └── main.yml │ └── vars │ └── main.yml └── vpc_create.yml
インベントリファイル
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat hosts [localhost] 127.0.0.1
サーバをプロビジョニングする訳ではないので、ローカルホストを指定
Role
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat roles/aws_vpc/tasks/main.yml
---
# tasks file for aws_vpc
- name: create_vpc
ec2_vpc_net:
name: "{{ vpc_name }}"
cidr_block: "{{ vpc_cidr }}"
region: "{{ region }}"
dns_hostnames: yes
dns_support: yes
register: vpc_info
# PUBLIC_SUBNETの作成
- name: create_public_subnet
ec2_vpc_subnet:
vpc_id: "{{ vpc_info.vpc.id }}"
cidr: "{{ item.pub_subnet_cidr }}"
az: "{{ item.subnet_az }}"
region: "{{ region }}"
resource_tags: { "Name":"{{ item.pub_subnet_name }}" }
register: pubsub_info
with_items:
- "{{ pub_subnet }}"
# PRIVATE_SUBNETの作成
- name: create_private_subnet
ec2_vpc_subnet:
vpc_id: "{{ vpc_info.vpc.id }}"
cidr: "{{ item.pri_subnet_cidr }}"
az: "{{ item.subnet_az }}"
region: "{{ region }}"
resource_tags: { "Name":"{{ item.pri_subnet_name }}" }
register: prisub_info
with_items:
- "{{ pri_subnet }}"
# IGWの作成
- name: create_igw
ec2_vpc_igw:
vpc_id: "{{ vpc_info.vpc.id }}"
region: "{{ region }}"
tags: { "Name":"{{ igw_name }}" }
register: igw_info
# ROUTETABLEの作成(IGW)
- name: create_route_table
ec2_vpc_route_table:
vpc_id: "{{ vpc_info.vpc.id }}"
subnets: "{{ atache_igw_subnet }}"
routes:
- dest: 0.0.0.0/0
gateway_id: "{{ igw_info.gateway_id }}"
region: "{{ region }}"
resource_tags: { "Name":"{{ rttable_pub_name }}" }
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat roles/aws_vpc/vars/main.yml
---
# vars file for aws_vpc
# REGION
region: "ap-northeast-1"
# VPC
vpc_name: "sanuki-wd-vpc"
vpc_cidr: "10.0.0.0/16"
# IGW
igw_name: "sanuki-igw"
# ROUTETABLE(PUBLIC)
rttable_pub_name: "sanuki-pub-rt"
# PUBLIC_SUBNET
pub_subnet:
- { pub_subnet_cidr: "10.0.10.0/24" ,subnet_az: "ap-northeast-1a" ,pub_subnet_name: "sanuki-wd-public-subnet-a" }
- { pub_subnet_cidr: "10.0.20.0/24" ,subnet_az: "ap-northeast-1c" ,pub_subnet_name: "sanuki-wd-public-subnet-c" }
# PRIVATE_SUBNET
pri_subnet:
- { pri_subnet_cidr: "10.0.50.0/24" ,subnet_az: "ap-northeast-1a" ,pri_subnet_name: "sanuki-wd-private-subnet-a" }
- { pri_subnet_cidr: "10.0.60.0/24" ,subnet_az: "ap-northeast-1c" ,pri_subnet_name: "sanuki-wd-private-subnet-c" }
# IGWに紐付けるサブネット
atache_igw_subnet:
- "10.0.10.0/24"
- "10.0.20.0/24"
playbook
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat vpc_create.yml
---
# VPC CREATE Playbook
- name: create vpc subnet igw routetable
hosts: localhost
connection: local
gather_facts: False
become: False
roles:
- aws_vpc
実行
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# ansible-playbook -i hosts vpc_create.yml
PLAY [create vpc subnet igw routetable] ********************************************************************************
TASK [aws_vpc : create_vpc] ********************************************************************************************
[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host 127.0.0.1 should use /usr/bin/python3, but is using
/usr/bin/python for backward compatibility with prior Ansible releases. A future Ansible release will default to using
the discovered platform python for this host. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. This feature
will be removed in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
changed: [127.0.0.1]
TASK [aws_vpc : create_public_subnet] **********************************************************************************
changed: [127.0.0.1] => (item={u'pub_subnet_name': u'sanuki-wd-public-subnet-a', u'subnet_az': u'ap-northeast-1a', u'pub_subnet_cidr': u'10.0.10.0/24'})
changed: [127.0.0.1] => (item={u'pub_subnet_name': u'sanuki-wd-public-subnet-c', u'subnet_az': u'ap-northeast-1c', u'pub_subnet_cidr': u'10.0.20.0/24'})
TASK [aws_vpc : create_private_subnet] *********************************************************************************
changed: [127.0.0.1] => (item={u'pri_subnet_cidr': u'10.0.50.0/24', u'pri_subnet_name': u'sanuki-wd-private-subnet-a', u'subnet_az': u'ap-northeast-1a'})
changed: [127.0.0.1] => (item={u'pri_subnet_cidr': u'10.0.60.0/24', u'pri_subnet_name': u'sanuki-wd-private-subnet-c', u'subnet_az': u'ap-northeast-1c'})
TASK [aws_vpc : create_igw] ********************************************************************************************
changed: [127.0.0.1]
TASK [aws_vpc : create_route_table] ************************************************************************************
changed: [127.0.0.1]
PLAY RECAP *************************************************************************************************************
127.0.0.1 : ok=5 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
補足
boto3 が必要になります。
pip でインストールしておいて下さい。
pip install boto boto3
稼働中の MySQLサーバ から slaveサーバ を構築する備忘録
こんにちは。
MySQLサーバ の slaveサーバを構築する機会があったので備忘録を残しておきます。
確認事項
バイナリログが出力されていて、尚且つ server-id が設定されている必要があります。
vi /etc/my.cnf ======================================= server-id=1001 log-bin = /var/lib/mysql/mysql-bin ======================================= systemctl restart mysqld
レプリケーション用ユーザの作成
レプリケーション用のユーザを事前に作成しておきます。
create user 'repl'@'%' identified by 'xxxxxxxxxx'; grant replication slave on *.* to 'repl'@'%';
dumpファイルの取得
mysqldump で dumpデータを取得します。
ストレージエンジンが innodb であれば、–single-transaction オプションで DBをロックせずに取得が可能です。
また、–master-data=2 オプションでバイナリログの読み出し開始位置を出力しておきます。
mysqldump -u root -p --skip-lock-tables --quote-names --single-transaction --master-data=2 -A > /var/tmp/mysqldump.sql
dumpファイルのインポート
slaveサーバ に dumpファイルを転送して流し込みます。
単純に mysql コマンドとリダイレクトを組み合わせるだけで大丈夫です。
scp user@xxx.xxx.xxx.xxx:/var/tmp/mysqldump.sql /var/tmp/. mysql -u root -p < /var/tmp/mysqldump.sql
テーブルチェック
mysql_upgrade コマンドを使ってテーブルのチェックを行います。
mysql_upgrade -u root -p systemctl restart mysqld
バイナリログの開始位置を確認
–master-data=2 オプションでバイナリログの読み出し開始位置が出力されているので確認します。
grep "CHANGE MASTER" /var/tmp/mysqldump.sql
レプリケーション設定
mysql> change master to
-> master_host='xxx.xxx.xxx.xxx',
-> master_user='repl',
-> master_password='xxxxxxxxxx',
-> master_log_file='[バイナリログ]',
-> master_log_pos=[ポジション];mysql> start slave; mysql> show slave status\G
【Ansible】いい感じにデータを変数にいれる【シェルスクリプト】
スペース区切りだったり、カンマ区切りのデータをいい感じに Ansible の変数に入れたいことってありますよね。
そんな時によく使うスクリプトです。
シェルスクリプト
vi var_create.sh
===============================================
#!/bin/bash
while IFS=' ' read key val
do
echo " - { domain: '$val' ,owner: '$key' }"
done < $1
vi data.txt ============================ user1 aaa user2 bbb user3 ccc
実行
[root@keisuke-main tmp]# ./var_create.sh data.txt
- { domain: 'aaa' ,owner: 'user1' }
- { domain: 'bbb' ,owner: 'user2' }
- { domain: 'ccc' ,owner: 'user3' }
【Ansible】Ansible と expect で MySQL 導入を自動化する【IaC】
こんにちは。
MySQL の導入が面倒だったので Ansible と expect で自動化にチャレンジします。
mysql_secure_installation の自動化
expect と awk でシェルスクリプトを作成します。
#!/bin/bash
# 初期パスワードを取得
IntPasswd=$(grep "A temporary password is generated for root@localhost:" /var/log/mysqld.log | awk '{ print $13}')
# パスワード指定
MysqlRootPasswd="{{ db_passwd }}"
expect -c '
set timeout 10;
spawn mysql_secure_installation;
expect "Enter password for user root:";
send -- "'"${IntPasswd}"'\n";
expect "New password:";
send -- "'"${MysqlRootPasswd}"'\n";
expect "Re-enter new password:";
send -- "'"${MysqlRootPasswd}"'\n";
expect "Change the password for root ?";
send "n\n";
expect "Remove anonymous users?";
send "y\n";
expect "Disallow root login remotely?";
send "y\n";
expect "Remove test database and access to it?";
send "y\n";
expect "Reload privilege tables now?";
send "y\n";
interact;'
awk で初期パスワードを取得し、対話処理は expect で処理します。
Playbook
Ansible の playbook で処理します。
---
# tasks file for mysql-server80
- name: install mysql80 repository
yum:
name: https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
state: present
- name: install mysql
yum:
name:
- mysql-server
- expect
state: present
- name: put my.cnf
template:
src: ../templates/my.cnf.j2
dest: /etc/my.cnf
owner: root
group: root
mode: 0644
backup: yes
- name: mkdir /var/log/mysql/
file:
path: /var/log/mysql
state: directory
owner: mysql
group: mysql
mode: 0755
- name: start mysql
systemd:
name: mysqld
state: started
enabled: yes
- name: confirm check_file
stat: path=/usr/local/etc/mysql_stat.txt
register: result_mysql_exit
- name: put mysql_secure_installation_script
template:
src: ../templates/mysql_secure_installation_script
dest: /tmp/mysql_secure_installation_script
owner: root
group: root
mode: 0755
- name: exec mysql_secure_installation_script
shell: "/tmp/mysql_secure_installation_script"
when: not result_mysql_exit.stat.exists
- name: create check_file
file:
path: /usr/local/etc/mysql_stat.txt
state: touch
mode: "u=rw,g=r,o=r"
- name: change error-log location
lineinfile:
dest: /etc/my.cnf
state: present
backrefs: yes
regexp: '^log-error = /var/log/mysqld.log'
line: 'log-error = /var/log/mysql/mysqld.log'
notify: mysqld_restart
おまけ
こちらに CentOS7用の playbook を纏めていますので宜しければ。
https://github.com/keisukesanuki/default-CentOS7
【サーバ移設】踏み台サーバを経由してrsyncする方法【rsync】
こんにちは。
先日にサーバ移設案件に携わる機会があって、踏み台サーバを経由して、目的のサーバにデータを同期する必要がありました。
その際に先輩に教えてもらった方法をメモレベルで残しておこうと思います。
rsync 用ユーザ作成
useradd rsync su rsync cd ~ mkdir .ssh chmod 700 .ssh
SSH 設定
vi /home/rsync/.ssh/config
===============================================
Host step-new
HostName 111.111.111.111
User step-new-user
IdentityFile ~/.ssh/id_rsa_step-new.pem
Host step-old
ProxyCommand ssh -W %h:%p step-new
HostName 222.222.222.222
User step-old-user
IdentityFile ~/.ssh/id_rsa_step-old.pem
Host target-server
ProxyCommand ssh -W %h:%p step-old
HostName 333.333.333.333
User target-server-user
IdentityFile ~/.ssh/id_rsa_target.pem
===============================================vi ~/.ssh/id_rsa_step-new.pem vi ~/.ssh/id_rsa_step-old.pem vi ~/.ssh/id_rsa_target.pem chmod 600 ~/.ssh/id_rsa_step-new.pem chmod 600 ~/.ssh/id_rsa_step-old.pem chmod 600 ~/.ssh/id_rsa_target.pem
データ同期
mkdir -p /var/tmp/rsync_results/test1 nohup time rsync -avzrn --rsync-path="sudo rsync" target-server:/home/target-server-user/ /home/purpose/ 1>/var/tmp/rsync_results/test1/result_$(date +"%Y%m%d").log 2>/var/tmp/rsync_results/test1/error_$(date +"%Y%m%d").log & nohup time rsync -avzr --rsync-path="sudo rsync" target-server:/home/target-server-user/ /home/purpose/ 1>/var/tmp/rsync_results/test1/result_$(date +"%Y%m%d").log 2>/var/tmp/rsync_results/test1/error_$(date +"%Y%m%d").log &
補足
・.ssh/ 以下に config ファイルを作成することで、踏み台サーバを経由して接続が出来る。
・秘密鍵は事前に配置しておく必要がある。
【ファイル共有】nfsサーバの構築手順【構築手順】
こんにちは。
移設案件でnfsサーバを構築したので、
備忘録として手順を残しておきます。
サーバ
nfs用のディレクトリの準備
mkfs -t xfs /dev/xvdf mkdir /mnt/nfsserv/ chmod 777 /mnt/nfsserv/ mount -t xfs -o nouuid /dev/xvdf /mnt/nfsserv/
fstabの編集
vi /etc/fstab =================================================================== /dev/xvdf /mnt/nfsserv xfs defaults 0 0 ===================================================================
nfsパッケージの導入
yum install nfs-utils systemctl start rpcbind systemctl start nfs-server systemctl enable rpcbind systemctl enable nfs-server
nfs設定ファイルの編集
vi /etc/exports ================================================================= /mnt/nfsserv/ 10.204.68.0/255.255.255.0(rw,sync,no_root_squash) =================================================================
systemctl restart rpcbind systemctl restart nfs-server
クライアント
nfsパッケージの導入
yum install nfs-utils systemctl start rpcbind systemctl enable rpcbind
マウント
mkdir /data mount -t nfs 10.204.68.32:/mnt/nfsserv /data
fstabの編集
vi /etc/fstab ====================================================================== 10.204.68.32:/mnt/nfsserv /data nfs defaults,_netdev 0 0 ======================================================================