読者です 読者をやめる 読者になる 読者になる

黒縁眼鏡は海を飛ぶ

IT中心にそこはかとなく

構成管理ツール「Ansible」入門 (2日目)~Playbookを書いてみた~

Ansible ssh

最近ちゃんとLPICの勉強をし始めました。カーネルコンパイルとか難しいですが、頑張りまする。

Ansibleの勉強するぞーって言っておきながら、あんまりできてません。まったくできてません。
が、Best Practiceを参考にplaybookは一応できたので、復習がてら書いていきます。
内容としては、インストール直後のサーバに対してssh接続できるところまでのplaybookとなりもうす。

構成管理ツール「Ansible」入門 (1日目)~基本的な使い方編~ - 黒縁眼鏡は海を飛ぶ

参考にさせていただいたところ

Ansible チュートリアル | Ansible Tutorial in Japanese
AnsibleでVPS初期設定 - blog.ieknir.com

私のplaybookはGithubのリポジトリにあげております。

全体構成

playbook  
├─hosts  
├─init.yml  
├─group_vars  
│  └─sshd  
└─roles  
   └─ssh  
      ├─handlers  
      │  └─main.yml  
      └─tasks  
         └─main.yml

なんか凄く見にくい感じになってそうで怖い。

 

hosts

$ cat hosts

[sshd]
192.168.10.101
192.168.10.102

本Playbookのinventoryファイル。 2つの対象ホストを指定しています。
/etc/ansible/hostsファイルを使用せず、こちらに用意しています。
いきなりであれですが、たぶんこのsshdってグループの命名は糞っぽい。

 

init.yml

$ cat init.yml

- hosts: sshd
  roles:
    - ssh

本playbookの親玉。
対象のホストグループはsshdであり、実行するroleはsshですよーと指定しています。

 

group_vars

$ cat group_vars/sshd

ansible_ssh_port: 22
ansilbe_ssh_user: root
ssh_user: sshuser
ssh_port: 22
ssh_user_passwd: password

sshdグループが共通で使用する変数をgroup_varsディレクトリ配下に別出ししています。
変数の参照については後ほど。

 

roles/ssh/handlers/main.yml

$ cat roles/ssh/handlers/main.yml

- name: restart sshd
  service: name=sshd state=restarted

このrolesディレクトリ以下に、各role毎にファイルを置いていきます。
roleの割り当てについては、sshだったりmysqlだったり。

handlersディレクトリは、task実行後にnotifyで呼び出されるハンドラです。
今回ですと、設定ファイルの書き換えなんかがあるので、sshdの再起動を記載しています。

 

rolse/ssh/tasks/main.yml

$ cat rolse/ssh/tasks/main.yml

- name : update
  shell: yum -y update

- name : install lib
  yum:
    name: libselinux-python
    state: latest

- name: user add
  user:
    name: "{{ ssh_user }}"
    groups: wheel
    password: "{{ ssh_user_passwd }}"

- name: mkdir .ssh
  file:
    path: /home/{{ ssh_user }}/.ssh
    state: directory
    owner: "{{ ssh_user }}"

- name: translate public key
  copy:
    src: /home/{{ ssh_user }}/.ssh/authorized_keys
    dest: /home/{{ ssh_user }}/.ssh/authorized_keys
    owner: "{{ ssh_user }}"
    mode: 0600

- name: allow wheel group to use sudo
  lineinfile:
    dest: /etc/sudoers
    regexp: "^# %wheel\\tALL=\\(ALL\\)\\tALL"
    line: "%wheel        ALL=(ALL)       ALL"
    backup: yes

- name: allow ssh_user to use ssh
  lineinfile:
    dest: /etc/ssh/sshd_config
    line: "AllowUsers {{ ssh_user }}"
  notify: restart sshd

長い。ブログに張り付けるにしては非常に長くてうざい。

libselinux-pythonを個別に入れているのは、入っていないとplaybook実行途中で死んじゃうからです。
もうlineinfileだけ覚えておけばなんとかできるような気がしてきたでござるよ。

一応私の環境だと、以下のコマンドで公開鍵認証を切ってから実施すると正常に動作することを確認しました。
(ここなんとかする方法あるのか)

$ ansible-playbook -v ./init.yml -i ./hosts -k
SSHPASSWORD:

-kオプションをつけるとPasswordによる認証となりまする。

とりあえず、以上。