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

試纏

ためしてまとめる〜色々なトピックやテーマについて試してみたり、まとめてみたりするブログです。

書籍『Ansible実践ガイド』を実践してみた - 第2章 Ansibleの基礎(その3.ansible-playbookコマンドの実践)

f:id:shinyaa31:20170116194242p:plain:w200

書籍『Ansible実践ガイド』第2章その3。以下2本のエントリの続きです。Vagrantを使ってマシン環境を複数用意し、コントロールサーバとターゲットサーバが存在する状況でansible-playbookコマンドを実行する、というものです。当エントリ(その3)で第2章が終わる形となります。

Ansible実践ガイド

Ansible実践ガイド

環境準備: 手順おさらい

  • Vagrantの環境を整え、利用イメージを登録。Vagrantfileの内容を、同じイメージを使って複数(3環境)立ち上げる設定とする。
$ vagrant box add centos_for_ansible_multi https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
$ pwd
/Users/shinyaa31/Vagrant/CentOS_multi
$
$ vagrant init centos_for_ansible_multi
$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos_for_ansible_multi"
  config.ssh.insert_key = false

  # マシン1台目
  config.vm.define "controller" do |controller|
    controller.vm.hostname = "controller.host"
    controller.vm.synced_folder ".", "/vagrant", disabled: true
    # controller.vm.network :forwarded_port, id: "ssh", guest: 22, host: 11022
    controller.vm.network "private_network", ip: "192.168.200.201"
  end

  # マシン2台目
  config.vm.define "target_1st" do |target_1st|
    target_1st.vm.hostname = "target1st.host"
    target_1st.vm.synced_folder ".", "/vagrant", disabled: true
    # target_1st.vm.network :forwarded_port, id: "ssh", guest: 22, host: 12022
    target_1st.vm.network "private_network", ip: "192.168.200.202"
  end

  # マシン3台目
  config.vm.define "target_2nd" do |target_2nd|
    target_2nd.vm.hostname = "target2nd.host"
    target_2nd.vm.synced_folder ".", "/vagrant", disabled: true
    # target_2nd.vm.network :forwarded_port, id: "ssh", guest: 22, host: 13022
    target_2nd.vm.network "private_network", ip: "192.168.200.203"
  end

end

環境作成、各種環境が稼働している事を確認。

$ vagrant up
$ vagrant status
Current machine states:

controller                running (virtualbox)
target_1st                running (virtualbox)
target_2nd                running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

ネットワークをリスタートさせ、アドレスが割り当てられている事を確認。

# 各種環境に対してそれぞれリスタートを仕掛ける
$ vagrant ssh controller -c "sudo systemctl restart network.service"
$ vagrant ssh target_1st -c "sudo systemctl restart network.service"
$ vagrant ssh target_2nd -c "sudo systemctl restart network.service"

# 『inet』の箇所にアドレスが割り当てられている事をそれぞれ確認
$ vagrant ssh target_1st -c "ip a"
    :
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    :
    inet 192.168.200.202/24 brd 192.168.200.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    :

コントロールサーバからターゲットサーバに対してping及びsshを実行、処理が届いている事を確認。

# ローカル端末からVagrant環境(コントロールサーバ)へログイン
$ vagrant ssh controller

# Vagrant環境(コントロールサーバ)からターゲットサーバへpingの確認
$ ping 192.168.200.202
$ ping 192.168.200.203

# Vagrant環境(コントロールサーバ)からターゲットサーバへsshログインの確認
# パスワード入力を求められるのでユーザー:vagrantに対するパスワード:<code>vagrant</code>を入力
$ ssh 192.168.200.202
$ ssh 192.168.200.203

Ansible実行に必要なソフトウェアのインストール実施。

$ sudo yum -y update
$ sudo yum -y install epel-release
$ sudo yum -y install sshpass
$ sudo yum -y install ansible
$ ansible --version
ansible 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
$ sudo vi /etc/ansible/ansible.cfg
----
# 下記の箇所をコメント解除&変更
forks          = 15
gathering = smart
host_key_checking = False
log_path = /home/vagrant/ansible.log
----

第2章 ansible-playbookコマンド実践

実行に用いるフォルダ構成を作成。

$ pwd
/home/vagrant/
$ mkdir -vp effective_ansible/section02/inventory/
mkdir: ディレクトリ `effective_ansible' を作成しました
mkdir: ディレクトリ `effective_ansible/section02' を作成しました
mkdir: ディレクトリ `effective_ansible/section02/inventory/' を作成しました

インベントリファイルの作成。

$ pwd
/home/vagrant/effective_ansible/section02/inventory
$ vi test2_inventory.ini

ファイルの内容はターゲットサーバ2つのIPアドレスを記載。

[test_servers]
192.168.200.202
192.168.200.203

ansible-playbookコマンド実行に用いる定義ファイルの作成。書籍の内容に倣いつつ、必要な箇所を置き換えています。

$ pwd
/home/vagrant/effective_ansible/section02
$ vi test_playbook.yml
---
- hosts: test_servers
  tasks:
  - name: create directory
    file:
      path: /home/vagrant/tmp
      state: directory
      owner: vagrant
      mode: 0755

  - name: copy file
    copy:
      src: /etc/hosts
      dest: /home/vagrant/tmp/hosts
      owner: vagrant
      mode: 0644

フォルダ・ファイルの構成は以下の様な形となります。

[vagrant@controller effective_ansible]$ sudo yum -y install tree
[vagrant@controller effective_ansible]$ pwd
/home/vagrant/effective_ansible
[vagrant@controller effective_ansible]$ tree
.
└── section02
    ├── inventory
    │   └── test2_inventory.ini
    └── test_playbook.yml

2 directories, 2 files

ansible-playbookコマンド実行。しかしエラーが出てしまいました。

$ ansible-playbook -i ./section02/inventory/test2_inventory.ini ./section02/test_playbook.yml 

PLAY [test_servers] ************************************************************

TASK [setup] *******************************************************************
fatal: [192.168.200.202]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", "unreachable": true}
fatal: [192.168.200.203]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", "unreachable": true}
    to retry, use: --limit @/home/vagrant/effective_ansible/section02/test_playbook.retry

PLAY RECAP *********************************************************************
192.168.200.202            : ok=0    changed=0    unreachable=1    failed=0   
192.168.200.203            : ok=0    changed=0    unreachable=1    failed=0 

何か認証がおかしかったか?公開鍵・秘密鍵の設定周りかな?(影響受けてそうだったのでVagrantfileにconfig.ssh.insert_key = falseの設定は追記しておいた)とか色々悩んでいたけれども、下記エントリの内容に--ask-passの記述があり、

ん?そういえばこの環境パスワード入力を求められていたよね?と思い実行時の引数に加えてみたら動きました。

$ ansible-playbook -i ./section02/inventory/test2_inventory.ini ./section02/test_playbook.yml --ask-pass
SSH password: 

PLAY [test_servers] ************************************************************

TASK [setup] *******************************************************************
ok: [192.168.200.202]
ok: [192.168.200.203]

TASK [create directory] ********************************************************
changed: [192.168.200.202]
changed: [192.168.200.203]

TASK [copy file] ***************************************************************
changed: [192.168.200.203]
changed: [192.168.200.202]

PLAY RECAP *********************************************************************
192.168.200.202            : ok=3    changed=2    unreachable=0    failed=0   
192.168.200.203            : ok=3    changed=2    unreachable=0    failed=0   

実行内容を確認してみます。意図した通りの内容になっている事が確認出来ました。

# ターゲットサーバその1(192.168.200.202)への処理内容確認
$ ssh 192.168.200.202
vagrant@192.168.200.202's password: 
Last login: Sat Jan 21 01:50:22 2017 from 192.168.200.201
Welcome to your Vagrant-built virtual machine.
[vagrant@target1st ~]$ ls
base.sh  cleanup.sh  puppet.sh  t1.txt  tmp  vagrant.sh  virtualbox.sh  zerodisk.sh
[vagrant@target1st ~]$ ls tmp/
hosts
[vagrant@target1st ~]$ cat tmp/hosts 
127.0.0.1 controller.host controller
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$ exit
ログアウト
Connection to 192.168.200.202 closed.

# ターゲットサーバその2(192.168.200.203)への処理内容確認
[vagrant@controller ~]$ ssh 192.168.200.203
vagrant@192.168.200.203's password: 
Last login: Sat Jan 21 01:50:23 2017 from 192.168.200.201
Welcome to your Vagrant-built virtual machine.
[vagrant@target2nd ~]$ ls
base.sh  cleanup.sh  puppet.sh  t2.txt  tmp  vagrant.sh  virtualbox.sh  zerodisk.sh
[vagrant@target2nd ~]$ ls tmp/
hosts
[vagrant@target2nd ~]$ cat tmp/hosts 
127.0.0.1   controller.host controller
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$ exit
ログアウト
Connection to 192.168.200.203 closed.

まとめ

プレイブックの実行については、大きく以下4つに分類される

  • PLAY
  • FACTS
  • TASK
  • SUMMARY

実行結果には以下の種類があり、Ansibleは再実行しても結果が同じ事が保証される、所謂『冪等性』を担保している

  • ok
  • changed
  • skip
  • unreachable
  • failed

という内容を解説し、第2章は終わっています。都合3本のエントリを消費するに至った形になりましたが、殊の外第2章の後半部分(ansible-playbook)を進めるのに手間が掛かってしまいました。

第2章を終えての雑感。色々と疑問符が消えないままのネタが出来てきたので以下にメモ。まだまだ完全理解までには至っていないですね。

  • 参考にしたエントリの中にはboxを『centos/7』で構成したものもあり、こちらをベースにしたbox構成ではサーバ間のssh通信の部分が上手く行かなかった。これはOSや環境によって色々と勝手が違って来てそうなので何やかんやでこの辺の初期設定作業には都度詰まりそうな気がする。情報ノウハウを上手く集約してスムーズに進めたいところです。
  • パスワード認証方式(--ask-pass)を使う場合、何らか(入力を)省く事は可能なのか否か。何となく無理っぽそうな気はするけど、どこかで調査対応してみたいと思います。
  • Vagrantが必要とする『SSH接続が出来る事』について、パスワード認証/鍵認証の仕組みや方式について十分な理解を得ておく必要がある。Vagrantとこれら認証方式の組み合わせ・お作法についても同様。
  • Vagrantfile、ansible.cfgの設定内容について把握して行く。これは書籍を読み進めて行く事でカバーして行ける...のかな?

引き続き第3章についても取り掛かって行きたいと思います。