書籍『Ansible実践ガイド』第2章その3。以下2本のエントリの続きです。Vagrantを使ってマシン環境を複数用意し、コントロールサーバとターゲットサーバが存在する状況でansible-playbook
コマンドを実行する、というものです。当エントリ(その3)で第2章が終わる形となります。
- 作者: 北山晋吾
- 出版社/メーカー: インプレス
- 発売日: 2016/12/15
- メディア: Kindle版
- この商品を含むブログを見る
- 書籍『Ansible実践ガイド』を実践してみた - 第2章 Ansibleの基礎(その1.Ansibleのインストールとansibleコマンドの実践) - 試纏
- 書籍『Ansible実践ガイド』を実践してみた - 第2章 Ansibleの基礎(その2.Vagrantによる複数仮想環境の準備) - 試纏
環境準備: 手順おさらい
- 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章についても取り掛かって行きたいと思います。