とあるイベントでElectronが面白そうと思って、ちょっと触ってみたのですが、VSCodeでのデバッグ設定でハマったのでメモ。
<前提環境>
いろいろ引っかかったこととかネタとかの保存用。最新技術ネタもある?? 最近はAzure DevOps Service(旧Visual Studio Team Services)とAzure DevOps Server(旧Team Foundation Server)多め。
とあるイベントでElectronが面白そうと思って、ちょっと触ってみたのですが、VSCodeでのデバッグ設定でハマったのでメモ。
<前提環境>
今回は備忘録的に超概略レベルで作成してます。
Hyper-V環境で新しい仮想マシンにISOファイルを指定するのがそろそろ面倒になってきたので、PXEブート環境を作成してみました。
最近はLinuxも使ってるので、サーバはCentOS7とWindowsです。
→既存のDHCPサーバ(Windows)とは別にPXEサーバを作成します。
※DHCPサーバの設定が変更できることが前提
<PXEサーバ(CentOS)側>
01.CentOS7をインストールする。
02.yum install httpd
03.firewall-cmd -add-service=http –permanent
04.firewall-cmd –reload
05.「/var/www/html/index.html」としてテストページを作成して、他のマシンから「http://[サーバ名]」でアクセスできることを確認
06.yum install syslinux xinetd tftp-server
07.mkdir /var/lib/tftpboot/pxelinux.cfg
08.cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
09.cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
10.vi /etc/xinetd.d/tftp
「disable = yes」→「disable = no」
11.start xinetd
12.enable xinetd
13.mkdir /var/lib/tftpboot/centos7
14.cp /run/media/[ログインユーザ名]/CentOS 7 x86_64/images/pxeboot/initrd.img /var/lib/tftpboot/centos7
※Hyper-Vの仮想マシンでCentOS7のISOイメージをマウントすると「/run/media/[ログインユーザ名]/CentOS 7 x86_64」にマウントされる
15.cp /run/media/[ログインユーザ名]/CentOS 7 x86_64/images/pxeboot/vmlinuz /var/lib/tftpboot/centos7
16.vi /var/lib/tftpboot/pxelinux.cfg/default
timeout 300
default menu.c32
menu title ***** PXE Boot Menu *****
label 1
menu label ^1. local boot
localboot
label 2
menu label ^2. Install CentOS7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img inst.repo=http://[サーバ名]/pxeboot/centos7 devfs=nomount
17.mkdir /var/www/html/pxeboot/centos7
18.cp -R /run/media/[ログインユーザ名]/CentOS 7 x86_64/ /var/www/html/pxeboot/centos7
<DHCPサーバ(Windows)側>
1.DHCP管理画面の「サーバー オプション」として
・「066 ブート サーバー ホスト名」に'[PXEサーバ名]’
・「067 ブート ファイル名」に’/pxelinux.0
を設定
DHCPサーバの設定変更ができないときは、DnsmasqでProxy DHCPを使えば対応できるらしいのですが、実機検証できたらまた書きます。
あと、Hyper-VでCentOSをPXEブートするときは、第1世代の仮想マシンを使用する必要があります。
→ISOイメージを直接マウントするときは第2世代でセキュアブートをOFFにすればインストールできますが、PXEブートでは起動イメージがロードできずにエラーになります。
いつの間にか、VSTS/TFSのLinux/OSX用ビルドエージェントの名前が「vsoAgent」から「vstsAgent」に変わってたので、改めて入れてみようと思い立ち、やるなら巷で噂のAnsibleも使ってみようとしました。
前回のGitBucketに続き、環境はCentOS7、Ansible:2.0.2.0になります。
古いAnsibleのバージョンでのサンプルが結構あったので、新しいバージョンでどう変わったかも確認してみました。
とりあえず作ってみたレベルなので、vstsAgentの設定変更やRoles分けはできてません。
<hosts>
[buildagent-servers]
192.168.xxx.xxx
[buildagent-servers:vars]
ansible_ssh_user=ansiuser
ansible_ssh_pass=xxxxxxxx
ansible_sudo_pass=xxxxxxxx
<playbook>
—
– hosts: buildagent-servers
remote_user: ansiuser
vars:
download_agent_archive: vsts-agent-rhel.7.2-x64-2.101.1.tar.gz
base_dir: "{{ ansible_env.HOME }}/buildagent"
tasks:
– name: Create base directory
file:
args:
path: "{{ base_dir }}"
state: directory
mode: 0755
– name: Create download directory
file:
args:
path: "{{ base_dir }}/download"
state: directory
mode: 0755
– name: Download vstsAgent
get_url:
args:
url: "http://github.com/Microsoft/vsts-agent/releases/download/v2.101.1/{{ download_agent_archive }}"
dest: "{{ base_dir }}/download"
force: no
– name: Deployment vstsAgent
unarchive:
args:
copy: no
src: "{{ base_dir }}/download/{{ download_agent_archive }}"
dest: "{{ base_dir }}"
creates: "{{ base_dir }}/run.sh"
– name: Download gradle archive
get_url:
args:
url: "https://services.gradle.org/distributions/gradle-2.13-bin.zip"
dest: /tmp
force: no
– name: Deployment gradle
unarchive:
args:
copy: no
src: /tmp/gradle-2.13-bin.zip
dest: /opt
creates: /opt/gradle-2.13
become: yes
– name: Create gradle symbolic link
file:
args:
src: /opt/gradle-2.13
path: /opt/gradle
state: link
become: yes
– name: export GRADLE_HOME
lineinfile:
args:
dest: /etc/profile.d/gradle.sh
line: export GRADLE_HOME=/opt/gradle
create: yes
become: yes
– name: export gradle path
lineinfile:
args:
dest: /etc/profile.d/gradle.sh
line: export PATH=$PATH:$GRADLE_HOME/bin
become: yes
<補足>
・相手先ホストでssh接続を設定する必要がある
・相手先ホストが複数の場合、ssh接続ユーザ/rootのパスワードを揃えた方が楽。(まとめて指定できる)
・OS環境変数は「ansible_env:~」で参照可能
・「Create ~ directory」は、pathに指定されたディレクトリが存在したらスキップ
・get_urlでforce: noの場合、ダウンロード対象が存在したらスキップ
・unarchiveでCopy: noとすることで、相手先ホスト内のファイルを解凍対象にできる
たしか、古いバージョンだとAnsibleのホストサーバから強制ダウンロードだったはず
・unarchiveでcreates:~に指定したファイルが存在したらスキップ
解凍後のファイルを指定すれば、再解凍せずにすむ
・sudo実行時は「become: yes」 ← 昔のバージョンだと「sudo: yes」
・gradleの実行パスは、バージョン切り替えできるようにsymbolic linkを使ってみた
・環境変数の変更は、CentOSだと「etc/profile.d」ディレクトリにあるシェルスクリプトを自動で取り込んでくれるので、今回は「gradle.sh」を個別作成した
Ansibleを全然使ったことがなかったので四苦八苦しましたが、一度作成したら離れられませんね。あとは接続先ホストでAnsibleが使えるようになるまでの初期設定(ホスト名/ネットワーク設定/ssh設定など)をどうにかできないかなと。それとWindows対応か・・・。
あ、yumを使うパターンがないw
ちなみに、相手先ホストはHyper-V仮想マシン、Playbookは前回書いたGitBucketでバージョン管理させてるので、「動かしてみてダメだったら戻してしまえ」ができるのは大きいです。
結構いろいろ悩んだのでメモとして。
<対象バージョン>
CentOS:7
Apache httpd:2.4.6
Java:OpenJDK 1.8
GitBucket:4.1
<手順>
毎回sudo打ちたくないので、suでrootで実行。
※自ホストを「server1.local」にしてますが、実際に作成したホスト名に変えてくださいね。
○アプリのインストール
# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
# yum -y install tomcat
# yum -y install httpd
# cd /var/lib/tomcat/webapps
# wget https://github.com/takezoe/gitbucket/releases/download/4.1/gitbucket.war
○サービス化/起動
# systemctl enable httpd
# systemctl start httpd
# systemctl enable tomcat
# systemctl start tomcat
ここまでで、自ホスト内で「http://server1.local:8080/gitbucket」でアクセスできるが、他ホストからは接続できない。
○ポート変更
「http://server1.local/gitbucket」でアクセスできるように変更します。
# vi /etc/tomcat/server.xml
・ServerNameを自ホストに変更します。
ServerName server1.local:80
・httpdの8080ポートを閉じます。
以下の部分を「<!– –>」でコメントアウト。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#vi /etc/httpd/conf.d/gitbucket.conf
・AJPを使ったProxyPassを設定します。
ProxyPass /gitbucket ajp://server1.local:8009/gitbucket
# systemctl restart httpd
ここまでで、自ホスト内で「http://server1.local/gitbucket」でアクセスできるが、他ホストからは接続できない。
○Firewallの設定変更
他ホストから接続できるようにhttpポートを通すようにします。
# firewall-cmd –add-service=http –permanent
# firewall-cmd –reload
ここまで変更すると、他ホストからも「http://server1.local/gitbucket」でアクセス可能。
<補足>
○デフォルトでAJPのConnectorは有効になっています。
(<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />)
○ネットで検索すると、「LoadModule proxy_module modules/mod_proxy.so」とかをhttpd.confに追加する手順がよく出てくるのですが、デフォルトだとhttpd.confに「Include conf.modules.d/*.conf」があって、「conf.modules.d/00-proxy.conf」に「LoadModule proxy_module modules/mod_proxy.so」「LoadModule proxy_ajp_module modules/mod_proxy_ajp.so」があるので追加しなくても大丈夫。
○ProxyPassの設定で、VirtualHostディレクティブを使うパターンとLocationディレクティブを使うパターンがよく出てくるのですが、バーチャルホストしないのであればVirtualHostは指定したくないですし、Locationディレクティブは公式ドキュメントを見ると「<Location>ディレクティブは ファイルシステム外のコンテンツにディレクティブを適用するときに 使用してください。」とあるのでこれも指定したくないということで、今回は両方とも使わず、直接ProxyPassディレクティブを使ってます。