tag:crieit.net,2005:https://crieit.net/magazines/ckoshien/Ansible%E9%80%A3%E8%BC%89/feed
【Ansible】VPSをAnsibleを使ってセットアップするの投稿 - Crieit
Crieitで連載「【Ansible】VPSをAnsibleを使ってセットアップする」の最近の投稿
2019-06-30T21:16:15+09:00
https://crieit.net/magazines/ckoshien/Ansible%E9%80%A3%E8%BC%89/feed
tag:crieit.net,2005:PublicArticle/15179
2019-06-30T21:16:15+09:00
2019-06-30T21:16:15+09:00
https://crieit.net/posts/Ansible-VPS-2
AnsibleでVPSをセットアップする【その2】
<p><a href="https://crieit.net/posts/VPS-Ansible">VPSをAnsibleを使ってセットアップする</a>の後日譚的なものです。</p>
<h1 id="docker/docker-composeのインストール"><a href="#docker%2Fdocker-compose%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">docker/docker-composeのインストール</a></h1>
<pre><code class="yml">- name: Add Docker GPG key
apt_key: url=https://download.docker.com/linux/ubuntu/gpg
</code></pre>
<h2 id="apt-get updateでロックがかかってしまう問題"><a href="#apt-get+update%E3%81%A7%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E5%95%8F%E9%A1%8C">apt-get updateでロックがかかってしまう問題</a></h2>
<h3 id="pathで指定したファイルを削除"><a href="#path%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4">pathで指定したファイルを削除</a></h3>
<p>state "absent"に変える。absent(欠席の意=つまりない状態)<br />
対義語は<strong>present</strong></p>
<pre><code class="yml">- name: remove lock file
file:
path: /var/lib/apt/lists/lock
state: absent
</code></pre>
<p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/makaaso/items/432274ac18fe5bd254e3">エラー「E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)」</a></p>
<h1 id="NodeJS/npmのインストール"><a href="#NodeJS%2Fnpm%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">NodeJS/npmのインストール</a></h1>
<p>後でgit pullしてnpm installするのですが、インストールされてないことに気づいたのでここでインストールしてしまいます。</p>
<pre><code class="yml"> - name: Install basic list of packages
apt:
name: ['apt-transport-https','ca-certificates','curl','gnupg2','software-properties-common','npm','nodejs']
state: present
update_cache: yes
</code></pre>
<pre><code class="yml"> - name: Add Docker APT repository
apt_repository:
repo: deb [arch=amd64] https://download.docker.com/linux/<span>{</span><span>{</span>ansible_distribution|lower<span>}</span><span>}</span> <span>{</span><span>{</span>ansible_distribution_release<span>}</span><span>}</span> stable
- name: Install Docker packages
apt:
name: ['docker-ce','docker-ce-cli','containerd.io']
state: present
- name: Install Docker-compose
shell: curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- name:
command: chmod +x /usr/local/bin/docker-compose
</code></pre>
<h1 id="プライベートリポジトリをgit clone"><a href="#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92git+clone">プライベートリポジトリをgit clone</a></h1>
<p>まだメインのスクリプトと統合してない状態です。<br />
githubからpersonal tokenを発行して使います。</p>
<pre><code class="yml">- hosts: all
user: "<span>{</span><span>{</span> user_name <span>}</span><span>}</span>"
#become: yes
tasks:
- name: git pull
git:
repo: "https://<span>{</span><span>{</span>account_name<span>}</span><span>}</span>:<span>{</span><span>{</span> personal_token <span>}</span><span>}</span>@github.com/<span>{</span><span>{</span>account_name<span>}</span><span>}</span>/<span>{</span><span>{</span> repo_name <span>}</span><span>}</span>.git"
dest: "~/<span>{</span><span>{</span> target_dir <span>}</span><span>}</span>"
accept_hostkey: yes
</code></pre>
<h1 id="課題点"><a href="#%E8%AA%B2%E9%A1%8C%E7%82%B9">課題点</a></h1>
<h2 id="docker-composeがパーミッションエラーで起動できない"><a href="#docker-compose%E3%81%8C%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84">docker-composeがパーミッションエラーで起動できない</a></h2>
<p>ユーザをsudoできる権限を持ったグループに追加しないといけないみたいです。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/docker/compose/issues/4181">ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?</a></p>
ckoshien
tag:crieit.net,2005:PublicArticle/15050
2019-06-01T23:26:13+09:00
2019-06-02T20:14:05+09:00
https://crieit.net/posts/VPS-Ansible
VPSをAnsibleを使ってセットアップする
<p>一念発起してVPSを借りたのですが、サーバの初期設定の操作で色々詰まってサーバ削除・新規作成を繰り返していたので、手順を残すこともできるAnsibleを使い始めました。</p>
<h1 id="Ansibleって?"><a href="#Ansible%E3%81%A3%E3%81%A6%EF%BC%9F">Ansibleって?</a></h1>
<p>RedHatが提供している、サーバの設定自動構成ツール。<br />
クライアントからサーバへSSHで接続してリモートでコマンドを実行できます。</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://docs.ansible.com/ansible/latest/index.html">Ansible Documentation</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://ja.wikipedia.org/wiki/Ansible_%28ソフトウェア%29">Ansible(ソフトウェア)</a></li>
</ul>
<h2 id="動作条件"><a href="#%E5%8B%95%E4%BD%9C%E6%9D%A1%E4%BB%B6">動作条件</a></h2>
<ul>
<li>クライアント: ansibleがインストールされていること</li>
<li>サーバ: SSHで接続できること。python(2系でも3系でも可)がインストールされていること。</li>
</ul>
<h1 id="まずクライアント(mac)にansibleをインストール"><a href="#%E3%81%BE%E3%81%9A%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%28mac%29%E3%81%ABansible%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">まずクライアント(mac)にansibleをインストール</a></h1>
<pre><code>$ brew install ansible
</code></pre>
<h1 id="playbookを作る"><a href="#playbook%E3%82%92%E4%BD%9C%E3%82%8B">playbookを作る</a></h1>
<p>playbookと呼ばれる、実行したいスクリプトをyamlで記述します。<br />
以下がplaybookの設定例です。</p>
<h2 id="サーバにログインする"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B">サーバにログインする</a></h2>
<p>hostsファイルで設定したallというグループに属するサーバにアクセスします。<br />
サーバ作成直後でroot以外のユーザがいない状況を想定しているのでrootでログインします。</p>
<pre><code class="yml">- hosts: all
user: root
</code></pre>
<h2 id="一般ユーザを新規作成する"><a href="#%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">一般ユーザを新規作成する</a></h2>
<p><strong>ubuntuはsudo権限を持ったグループ名がsudo</strong></p>
<pre><code class="yml"> - name : add user
user:
name: "<span>{</span><span>{</span> user_name <span>}</span><span>}</span>"
state: present
password: "<span>{</span><span>{</span> password <span>}</span><span>}</span>"
groups: sudo
</code></pre>
<h2 id=".sshディレクトリを作成する"><a href="#.ssh%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">.sshディレクトリを作成する</a></h2>
<p><strong>パーミッションは700ではなく0700</strong></p>
<pre><code class="yml">- name: mkdir .ssh
file:
path: "~<span>{</span><span>{</span> user_name <span>}</span><span>}</span>/.ssh"
state: directory
owner: "<span>{</span><span>{</span> user_name <span>}</span><span>}</span>"
group: "<span>{</span><span>{</span> user_name <span>}</span><span>}</span>"
mode: 0700
</code></pre>
<h2 id="公開鍵を一般ユーザのホームディレクトリに配置する"><a href="#%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B">公開鍵を一般ユーザのホームディレクトリに配置する</a></h2>
<p><strong>パーミッションは600ではなく0600</strong></p>
<pre><code class="yml">- name: private key for slave server
copy:
dest: "~<span>{</span><span>{</span> user_name <span>}</span><span>}</span>/.ssh/authorized_keys"
content: "<span>{</span><span>{</span> lookup('file', '~/.ssh/public_openSSH') <span>}</span><span>}</span>"
mode: 0600
owner: "<span>{</span><span>{</span> user_name <span>}</span><span>}</span>"
group: "<span>{</span><span>{</span> user_name <span>}</span><span>}</span>"
</code></pre>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://dev.classmethod.jp/server-side/ansible/deploy-private-key-using-ansible-lookup/">Ansibleのlookupを使って秘密鍵を配備する</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.netassist.ne.jp/blog/?p=1970">Ansibleで複数ユーザ追加と鍵作成</a></li>
</ul>
<h2 id="セキュリティ設定変更"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4">セキュリティ設定変更</a></h2>
<h3 id="ポート番号変更"><a href="#%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E5%A4%89%E6%9B%B4">ポート番号変更</a></h3>
<pre><code class="yml"> - name: "待受ポートを <span>{</span><span>{</span> sshd_port <span>}</span><span>}</span> に変更"
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^Port"
insertafter: "^#Port"
line: "Port <span>{</span><span>{</span> sshd_port <span>}</span><span>}</span>"
</code></pre>
<ul>
<li>iptablesで変更後のSSHポートを許可</li>
</ul>
<pre><code class="yml"> - name: Allow new incoming SYN packets.
iptables:
chain: INPUT
protocol: tcp
destination_port: "<span>{</span><span>{</span> sshd_port <span>}</span><span>}</span>"
ctstate: NEW
syn: match
jump: ACCEPT
comment: Accept new SSH connections.
</code></pre>
<ul>
<li>ufw(ubuntuのファイアウォール)で変更後のSSHポートを許可</li>
</ul>
<h3 id="パスワードログイン禁止"><a href="#%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%A6%81%E6%AD%A2">パスワードログイン禁止</a></h3>
<pre><code class="yml">- name: パスワード認証の無効化
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^PasswordAuthentication"
insertafter: "^#PasswordAuthentication"
line: "PasswordAuthentication no"
</code></pre>
<h3 id="rootログイン禁止"><a href="#root%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%A6%81%E6%AD%A2">rootログイン禁止</a></h3>
<p><a target="_blank" rel="nofollow noopener" href="https://blog.apar.jp/linux/5299/">Ansible でSSHのセキュリティ設定</a></p>
<h2 id="rootユーザからログアウト"><a href="#root%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%8B%E3%82%89%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88">rootユーザからログアウト</a></h2>
<p>これ以降は作成した一般ユーザでスクリプトを実行した方がよいのでユーザ切り替えのためにログアウト。</p>
<pre><code class="yml">- name: logout
meta: reset_connection
</code></pre>
<h1 id="playbookを実行する"><a href="#playbook%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">playbookを実行する</a></h1>
<p><strong>server_setup.yml</strong>というplaybookを、<strong>hosts</strong>というファイルで設定したサーバに対して実行します。公開鍵認証をする場合は<strong>private-key</strong>オプションでopenSSH形式の秘密鍵を指定します。</p>
<pre><code>$ ansible-playbook server_setup.yml -i hosts --private-key ~/.ssh/private_openSSH.ppk
</code></pre>
<h1 id="参考リンク"><a href="#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/okatai/items/ad02dbbcbe710ba56589">Ansibleでユーザ追加とグループ作成方法</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/rch1223/items/e698036e52661c333f4c">ubuntuサーバをansible制御下に置くための準備</a></li>
</ul>
ckoshien