2019版
要件
Ansibleの開発環境をできるだけ簡単に構築する。
(MAC環境を想定)
Windows10の場合、Windows Subsystem for Linux上でLinuxベースの導入を行えば動作する様です。
なお、Ansible controllerもDockerコンテナにした版も記述しました。
Ansible Playbook検証環境構築2 (2019版)
ソリューション
環境制御にはKitchenCIを使用
KitchenCIは、一連の流れとして以下を行うCIツール。
- 検証環境としてVirtualBox上VMやDockerコンテナを立ち上げる
- 立ち上げた環境にChefやAnsibleなどの構成管理ツールを適用
- 立ち上げた環境に対してテストを実行(オプション)
- 立ち上げた環境を削除(オプション)
参照:
導入設定は、前提となるRubyなどを含め、Chef Workstationのインストールで対応。
Ansibleはローカルに導入
立ち上げるテスト環境だけでなく、外部のノードも同じAnsibleで管理出来るようにする。
テスト環境としてのVirtualBox上VMとDockerコンテナの比較
- VirtualBox上VM
起動は数分程度
ほぼ全てのOS機能が使用可能
- Dockerコンテナ
イメージがキャッシュされていれば起動は数十秒程度
一部OS関連の機能は検証不可
環境
- macOS 10.14.5
環境構築
Ansible導入
Homebrewを導入
Mac の開発を便利にするパッケージ管理ソフト Homebrew のインストール手順
その後
$ brew install ansible
...
ローカル環境で動作するので、~/.ansible.cfgなどでAnsibleのパラメーター指定が可能。
VirtualBox導入(オプション)
Dockerを使用する場合には不要
以下から Mac用の導入イメージをダウンロードし実行
- Virtualbox: https://www.virtualbox.org/wiki/Downloads
- Vagrant: https://www.vagrantup.com/downloads.html
- VirtualBox管理用
Docker Desktop for Mac導入(オプション)
VirtualBoxを使用する場合には不要
以下から Mac用の導入イメージをダウンロードし実行
手順:
Chef Workstation導入/設定
以下から Mac用の導入イメージをダウンロードし実行
導入手順:
設定手順:
~/.bash_profile に環境変数設定のエントリーを追記し反映
$ echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
$ . ~/.bash_profile
KitchenCIプラグイン導入
Ansible対応
- kitchen-ansiblepushプラグイン
- ローカルのAnsibleをそのまま使用する
他に、今回は使用しないが、対象ホストにAnsibleを導入し、playbookなどを送り込んでローカルモードで適用する、kitchen-ansibleプラグインがある。
参照:
$ gem install kitchen-ansiblepush
...
Docker対応(オプション)
- kitchen-dockerプラグイン
virtualboxを使用する場合には不要
$ gem install kitchen-docker # オプション
...
Playbookディレクトリー構成作成
$ mkdir playbooks1
$ cd playbooks1
$ mkdir roles host_vars group_vars vars
テンプレートkitchen.yml作成 (以降の例は基本的にDockerとする)
KitchenCIの設定ファイルは、 .kitchen.yml もしくは kitchen.yml
テンプレートとなるファイルを作成後、必要な修正、追記を行う。
$ kitchen init --driver=kitchen-docker --provisioner=ansible_push
create kitchen.yml
create chefignore
create test/integration/default
なお、単にkitchen.ymlのテンプレートを作成しているだけであり、直接、最終形のkitchen.ymlを配置しても良い。
テンプレートとして作成されたkitchen.yml (Dockerの例)
---
driver:
name: docker
provisioner:
name: ansible_push
platforms:
- name: ubuntu-16.04
- name: centos-7
suites:
- name: default
run_list:
attributes:
設定
編集後kitchen.yml
---
driver:
name: docker
#name: vagrant # VirtualBoxを使用する場合
provisioner:
name: ansible_push
chef_bootstrap_url: false # Chefクライアントを導入しない
playbook: ./site.yml # playbook指定
#mygroup: group1 # 対象ノードが属するグループ
verifier: # inspecによるテスト(オプション)
name: inspec
inspec_tests:
- test/integration/default # inspecテストのディレクトリー
platforms:
#- name: ubuntu-16.04 # 使用しない環境ならコメントアウト
- name: centos-7
suites:
- name: default
run_list:
attributes:
-
github: kitchen-docker
Docker関連のパラメーター指定が必要な場合、README.md を参照して kitchen.ymlに設定を追記 -
github: kitchen-ansiblepush
Ansible関連のtagやgroup指定などが必要な場合、README.md を参照して kitchen.ymlに設定を追記
playbook本体例
treeコマンドを導入してみる
---
- hosts: all
#gather_facts: false
become: true
#vars:
#vars_files:
tasks:
- name: install tree command
package:
name: tree
InSpecテスト例(オプション)
# encoding: utf-8
describe package('tree') do
it { should be_installed }
end
環境の作成、Ansibleによる収束、InSpecによるテスト
$ kitchen test -d never
-----> Starting Kitchen (v1.25.0)
-----> Cleaning up any prior instances of <default-centos-7>
-----> Destroying <default-centos-7>...
Finished destroying <default-centos-7> (0m0.00s).
-----> Testing <default-centos-7>
-----> Creating <default-centos-7>...
Sending build context to Docker daemon 37.89kB
Step 1/17 : FROM centos:centos7
---> 1e1148e4cc2c
Step 2/17 : ENV container docker
---> Using cache
---> d69647403b44
Step 3/17 : RUN yum clean all
---> Using cache
---> 68405856fe30
Step 4/17 : RUN yum install -y sudo openssh-server openssh-clients which curl
---> Using cache
---> 797f42008c72
Step 5/17 : RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
---> Using cache
---> a6036be76703
Step 6/17 : RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
---> Using cache
---> ece9cbc7b147
Step 7/17 : RUN if ! getent passwd kitchen; then useradd -d /home/kitchen -m -s /bin/bash -p '*' kitchen; fi
---> Using cache
---> d7206367b91e
Step 8/17 : RUN echo "kitchen ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
---> Using cache
---> d975788e9185
Step 9/17 : RUN echo "Defaults !requiretty" >> /etc/sudoers
---> Using cache
---> 59846ab4db2d
Step 10/17 : RUN mkdir -p /home/kitchen/.ssh
---> Using cache
---> 120caf615677
Step 11/17 : RUN chown -R kitchen /home/kitchen/.ssh
---> Using cache
---> 5b08f6495d65
Step 12/17 : RUN chmod 0700 /home/kitchen/.ssh
---> Using cache
---> 3e2097cabd1e
Step 13/17 : RUN touch /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 28b369378683
Step 14/17 : RUN chown kitchen /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 0dbcdafd6765
Step 15/17 : RUN chmod 0600 /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 83be9ea85caa
Step 16/17 : RUN mkdir -p /run/sshd
---> Using cache
---> d9c48bb3b097
Step 17/17 : RUN echo ssh-rsa\ AAAAB3NzaC1yc2EAAAADAQABAAABAQDOpdM/v1dEnD/MBUqcD0\+iYBf28B0S5AhA4weEe5hsc4uVIZgGoSEPV7qiceNiZhBMl7oKK1q6boV8wMiMJEyFXAKSAhrMIdUwgc1rL/Z6KP/WqeE1UWRNABR4SvOiQQ3ClpSkhOr8MXlPJ8\+FBVrAMuoyhiERT/epCnINlxN7LL23twUocYjszeDRTzHfdWeDNzQ8ppCNmhb3MiWS0k3LODfMuisA0XsMlm/y7Owd4V8D5/4IcdhhMGLfCRHx3dqkmVbfayPUJeFNSIWbW0ftlCCDJX9muASGuUn32z3ZP4rSNFzEtTa7JwJnxaEJKe\+XPpkqvn0rRR7m1JHM80MJ\ kitchen_docker_key >> /home/kitchen/.ssh/authorized_keys
---> Using cache
---> ca9f41e1e1ac
Successfully built ca9f41e1e1ac
565aaea2bb356eb108f806e0b54c039a077808624e58c3c6272093dbb8aa9764
0.0.0.0:32777
[SSH] Established
Finished creating <default-centos-7> (0m1.77s).
-----> Converging <default-centos-7>...
Preparing files for transfer
*************** AnsiblePush install_command ***************
Ansible push config validated
Transferring files to <default-centos-7>
*************** AnsiblePush run ***************
PLAY [all] *********************************************************************************************************************
TASK [install tree command] ****************************************************************************************************
changed: [centos-7]
PLAY RECAP *********************************************************************************************************************
centos-7 : ok=1 changed=1 unreachable=0 failed=0
*************** AnsiblePush end run *******************
Downloading files from <default-centos-7>
Finished converging <default-centos-7> (0m14.34s).
-----> Setting up <default-centos-7>...
Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
Loaded tests from {:path=>".Users.xxxx.yyyy.zzzz.playbooks1.test.integration.default"}
Profile: tests from {:path=>"/Users/xxxx/yyyy/zzzz/playbooks1/test/integration/default"} (tests from {:path=>".Users.xxxx.yyyy.zzzz.playbooks1.test.integration.default"})
Version: (not specified)
Target: ssh://kitchen@localhost:32777
System Package tree
✔ should be installed
Test Summary: 1 successful, 0 failures, 0 skipped
Finished verifying <default-centos-7> (0m0.65s).
Finished testing <default-centos-7> (0m16.78s).
-----> Kitchen is finished. (0m23.23s)
作成された環境の状態
$ kitchen list
Instance Driver Provisioner Verifier Transport Last Action Last Error
default-centos-7 Docker AnsiblePush Inspec Ssh Verified <None>
作成された環境へのログイン
$ kitchen login
Last login: Thu Jun 6 06:04:16 2019 from 172.17.0.1
[kitchen@565aaea2bb35 ~]$ which tree
/usr/bin/tree
[kitchen@565aaea2bb35 ~]$ id
uid=1000(kitchen) gid=1000(kitchen) groups=1000(kitchen)
[kitchen@565aaea2bb35 ~]$ sudo su -
[root@565aaea2bb35 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@565aaea2bb35 ~]# logout
[kitchen@565aaea2bb35 ~]$ logout
Connection to localhost closed.
Ansibleの再適用
適用時にエラーだった場合など、playbookを修正して再適用が可能。
$ kitchen converge
-----> Starting Kitchen (v1.25.0)
-----> Converging <default-centos-7>...
Preparing files for transfer
*************** AnsiblePush install_command ***************
Ansible push config validated
Transferring files to <default-centos-7>
*************** AnsiblePush run ***************
PLAY [all] *********************************************************************************************************************
TASK [install tree command] ****************************************************************************************************
ok: [centos-7]
PLAY RECAP *********************************************************************************************************************
centos-7 : ok=1 changed=0 unreachable=0 failed=0
*************** AnsiblePush end run *******************
Downloading files from <default-centos-7>
Finished converging <default-centos-7> (0m7.54s).
-----> Kitchen is finished. (0m14.35s)
検証の再実行
$ kitchen verify
-----> Starting Kitchen (v1.25.0)
-----> Setting up <default-centos-7>...
Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
Loaded tests from {:path=>".Users.aa220269.repo.repo-test.cookbooks.playbooks1.test.integration.default"}
Profile: tests from {:path=>"/Users/aa220269/repo/repo-test/cookbooks/playbooks1/test/integration/default"} (tests from {:path=>".Users.aa220269.repo.repo-test.cookbooks.playbooks1.test.integration.default"})
Version: (not specified)
Target: ssh://kitchen@localhost:32778
System Package tree
✔ should be installed
Test Summary: 1 successful, 0 failures, 0 skipped
Finished verifying <default-centos-7> (0m0.54s).
-----> Kitchen is finished. (0m6.49s)
環境の消去
$ kitchen destroy
-----> Starting Kitchen (v1.25.0)
-----> Destroying <default-centos-7>...
PID USER TIME COMMAND
37236 root 0:00 /usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes -o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid
565aaea2bb356eb108f806e0b54c039a077808624e58c3c6272093dbb8aa9764
565aaea2bb356eb108f806e0b54c039a077808624e58c3c6272093dbb8aa9764
Finished destroying <default-centos-7> (0m1.01s).
-----> Kitchen is finished. (0m7.27s)
なお、その他の環境消去方法としては、kitchen test -d never時に、-d neverをつけなければ、毎回環境の削除まで行われる。
環境消去の確認
$ kitchen list
Instance Driver Provisioner Verifier Transport Last Action Last Error
default-centos-7 Docker AnsiblePush Inspec Ssh <Not Created> <None>
ansiblepush使用における考慮点
- テスト環境ホストを持つインベントリーが自動的に作成され使用される
- グループを指定するには、kitchen.ymlにその設定を記載する。
- mygroup: などを利用
- host変数やgroup変数は、インベントリー以外に記載。
- ./host_vars/<hostname>.yml
- ./group_vars/<groupname>.yml
- ./vars/<...>.yml
他ノードにansible-playbookにて反映させる例
$ ansible-playbook -i targethostname, site.yml
targethostnameの後に,が必要であることに注意。
Chef Cookbookの開発
Chef Cookbookの開発も可能な状態となっているので、簡単に手順を記す。
cookbook雛形作成
book1という名前でcookbookを作成する
$ chef generate cookbook book1
Generating cookbook book1
- Ensuring correct cookbook file content
- Committing cookbook files to git
- Ensuring delivery configuration
- Ensuring correct delivery build cookbook content
- Adding delivery configuration to feature branch
- Adding build cookbook to feature branch
- Merging delivery content feature branch to master
Your cookbook is ready. Type `cd book1` to enter it.
There are several commands you can run to get started locally developing and testing your cookbook.
Type `delivery local --help` to see a full list.
Why not start by writing a test? Tests for the default recipe are stored at:
test/integration/default/default_test.rb
If you'd prefer to dive right in, the default recipe can be found at:
recipes/default.rb
$ cd book1
作成される.kitchen.yml
$ cat .kitchen.yml
---
driver:
name: vagrant
provisioner:
name: chef_zero
# You may wish to disable always updating cookbooks in CI or other testing environments.
# For example:
# always_update_cookbooks: <%= !ENV['CI'] %>
always_update_cookbooks: true
verifier:
name: inspec
platforms:
- name: ubuntu-16.04
- name: centos-7
suites:
- name: default
run_list:
- recipe[book1::default]
verifier:
inspec_tests:
- test/integration/default
attributes:
この場合、kitchen test -d neverにて、以下が実行される
- virtualBoxでVMが起動
- VMにrecipes/default.rbレシピが適用される
- VMにInSpecのtest/integration/default/default_test.rbテストが適用される(内容はサンプル)
- 環境は削除されない(-d neverオプションの為)
.kitchen.ymlの編集
必要に応じて.kitchen.ymlを編集
- Dockerを使用するには、driver: の name: vagrant を name: docker に変更
- ubuntuをコメントアウト
など
レシピの編集
たとえばtreeコマンドの導入をさせてみる。
$ echo 'package "tree"' >> recipes/default.rb
kitchen test -d never実行
$ kitchen test -d never
-----> Starting Kitchen (v1.25.0)
WARN: Unresolved specs during Gem::Specification.reset:
bundler (>= 1.10)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
-----> Cleaning up any prior instances of <default-centos-7>
-----> Destroying <default-centos-7>...
PID USER TIME COMMAND
89060 root 0:00 /usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes -o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid
7144930dec9511cbaba8011382668df2904e47fd2936dfb923715274a0a13e7f
7144930dec9511cbaba8011382668df2904e47fd2936dfb923715274a0a13e7f
Finished destroying <default-centos-7> (0m1.82s).
-----> Testing <default-centos-7>
-----> Creating <default-centos-7>...
Sending build context to Docker daemon 206.8kB
Step 1/17 : FROM centos:centos7
---> 1e1148e4cc2c
Step 2/17 : ENV container docker
---> Using cache
---> d69647403b44
Step 3/17 : RUN yum clean all
---> Using cache
---> 68405856fe30
Step 4/17 : RUN yum install -y sudo openssh-server openssh-clients which curl
---> Using cache
---> 797f42008c72
Step 5/17 : RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
---> Using cache
---> a6036be76703
Step 6/17 : RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
---> Using cache
---> ece9cbc7b147
Step 7/17 : RUN if ! getent passwd kitchen; then useradd -d /home/kitchen -m -s /bin/bash -p '*' kitchen; fi
---> Using cache
---> d7206367b91e
Step 8/17 : RUN echo "kitchen ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
---> Using cache
---> d975788e9185
Step 9/17 : RUN echo "Defaults !requiretty" >> /etc/sudoers
---> Using cache
---> 59846ab4db2d
Step 10/17 : RUN mkdir -p /home/kitchen/.ssh
---> Using cache
---> 120caf615677
Step 11/17 : RUN chown -R kitchen /home/kitchen/.ssh
---> Using cache
---> 5b08f6495d65
Step 12/17 : RUN chmod 0700 /home/kitchen/.ssh
---> Using cache
---> 3e2097cabd1e
Step 13/17 : RUN touch /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 28b369378683
Step 14/17 : RUN chown kitchen /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 0dbcdafd6765
Step 15/17 : RUN chmod 0600 /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 83be9ea85caa
Step 16/17 : RUN mkdir -p /run/sshd
---> Using cache
---> d9c48bb3b097
Step 17/17 : RUN echo ssh-rsa\ AAAAB3NzaC1yc2EAAAADAQABAAABAQDCK2s5z4v1EfZ689ISCSftYi4jJBvq32wWmuLHTjpyT5acL\+0b/1v2PLjjj7dTiceNRohNTwXsgMWa6I5qw6MDQR28USOSUmIHMYX\+DZzbtxI0\+BwLFuiOJAvXTzX6jaNXeuepPceUDXzcyLBhsaXVu51I/OrT/iq0gtYZw5O2syMpzdG8k\+nH4/J2mLCEzz2B9C4brhmgWNnpEYbzS\+3G8/7/HQhpbLohvwEZ2XDXQGf50AkAQZe7EYwB35WNAHgLvGfBeISZd\+5XuP6WwMyAk6hPOdbolcip6A0ZYfWgE851syIKV6sQTZ/2DD2/Gr8E7FrvcFCZ3KCbvqOPlkdT\ kitchen_docker_key >> /home/kitchen/.ssh/authorized_keys
---> Using cache
---> 2764f90516e7
Successfully built 2764f90516e7
ddeff25e32cabb62f4eef738102e18cd8f5ccdb15a7707582056296e52e01783
0.0.0.0:32782
[SSH] Established
Finished creating <default-centos-7> (0m1.97s).
-----> Converging <default-centos-7>...
Preparing files for transfer
Preparing dna.json
Resolving cookbook dependencies with Berkshelf 7.0.8...
Removing non-cookbook files before transfer
Preparing validation.pem
Preparing client.rb
-----> Installing Chef install only if missing package
Downloading https://omnitruck.chef.io/install.sh to file /tmp/install.sh
Trying curl...
Download complete.
el 7 x86_64
Getting information for chef stable for el...
downloading https://omnitruck.chef.io/stable/chef/metadata?v=&p=el&pv=7&m=x86_64
to file /tmp/install.sh.43/metadata.txt
trying curl...
sha1 bcb835748819813842b664d7bdb1cf509eb71c09
sha256 85365d0a4c68a3445743d18e70055d762648bf673fc95f1e0e17194701f64d5f
url https://packages.chef.io/files/stable/chef/15.0.300/el/7/chef-15.0.300-1.el7.x86_64.rpm
version 15.0.300
downloaded metadata file looks valid...
downloading https://packages.chef.io/files/stable/chef/15.0.300/el/7/chef-15.0.300-1.el7.x86_64.rpm
to file /tmp/install.sh.43/chef-15.0.300-1.el7.x86_64.rpm
trying curl...
Comparing checksum with sha256sum...
WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
You are installing an omnibus package without a version pin. If you are installing
on production servers via an automated process this is DANGEROUS and you will
be upgraded without warning on new releases, even to new major releases.
Letting the version float is only appropriate in desktop, test, development or
CI/CD environments.
WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
Installing chef
installing with rpm...
warning: /tmp/install.sh.43/chef-15.0.300-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:chef-15.0.300-1.el7 ################################# [100%]
Thank you for installing Chef Infra Client! For help getting started visit https://learn.chef.io
Transferring files to <default-centos-7>
+---------------------------------------------+
✔ 2 product licenses accepted.
+---------------------------------------------+
Starting Chef Infra Client, version 15.0.300
[2019-06-07T01:57:09+00:00] WARN: Plugin Network: unable to detect ipaddress
Creating a new client identity for default-centos-7 using the validator key.
resolving cookbooks for run list: ["book1::default"]
Synchronizing Cookbooks:
- book1 (0.1.0)
Installing Cookbook Gems:
Compiling Cookbooks...
Converging 1 resources
Recipe: book1::default
* yum_package[tree] action install
- install version 0:1.6.0-10.el7.x86_64 of package tree
Running handlers:
Running handlers complete
Chef Infra Client finished, 1/1 resources updated in 16 seconds
Downloading files from <default-centos-7>
Finished converging <default-centos-7> (1m13.92s).
-----> Setting up <default-centos-7>...
Finished setting up <default-centos-7> (0m0.00s).
-----> Verifying <default-centos-7>...
Loaded tests from {:path=>".Users.xxxx.yyyy.zzzz.book1.test.integration.default"}
Profile: tests from {:path=>"/Users/xxxx/yyyy/zzzz/book1/test/integration/default"} (tests from {:path=>".Users.xxxx.yyyy.zzzz.book1.test.integration.default"})
Version: (not specified)
Target: ssh://kitchen@localhost:32782
User root
↺
Port 80
↺
Test Summary: 0 successful, 0 failures, 2 skipped
Finished verifying <default-centos-7> (0m0.87s).
Finished testing <default-centos-7> (1m18.61s).
-----> Kitchen is finished. (1m26.88s)