このHowtoでは、構成管理ツール Ansible を用いたArmadilloの制御方法を紹介します。
概要
Ansibleは、レッドハット社が開発するオープンソース構成管理ツールです。
AnsibleをインストールしたAnsibleサーバーから、複数のホストを制御することが可能です。
Ansibleの特徴は以下の通りです。
- シンプル
Ansibleでは2つのテキストファイルを使用します。
制御対象ホストを定義するinventoryと、制御内容を定義するPlaybookです。 - エージェントレス
ホストに、sshとpython(バージョン2.4以上)がインストールされていれば動作可能です。
Ansibleを動作させる為に、ホストにAnsible用アプリケーションをインストールする必要はありません。
事前準備
本Howtoでは、AnsibleサーバーにATDEを、ホストにArmadillo-IoT G3 M1を使用します。
Ansibleサーバーの準備
Ansibleのインストール
AnsibleサーバーにAnsibleをインストールします。
以下のコマンドを入力するとAnsibleをインストールできます1。
[ATDE ~]$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
[ATDE ~]$ sudo apt update
[ATDE ~]$ sudo apt install ansible
ホストの準備
ホストにsshでログイン出来るようにします。
製品マニュアルを参照し(Armadillo-IoT G3であれば22.5. sshでArmadillo-IoT G3に接続する)、sshでの接続ができるように設定してください。2
また、本Howtoではatmarkユーザーアカウントでsshログインし、sudoコマンドを使用して操作を行います。
Armadillo-IoT G3のatmarkユーザーは、初期設定ではsudoコマンドを実行できませんので、 Armadillo-IoT G3: atmarkユーザーでsudoコマンドを実行できるようにする を参照して、atmarkユーザーでsudoコマンドを実行できるようにしてください。
ansibleコマンドで死活監視
Playbookを使用しないで、複数ホストを制御します。
ホストにuptimeコマンドを実行させることで死活監視を行います。
/etc/ansible/hostsにホストのIPアドレスを記載します。名前解決が可能な環境であればホスト名も使用可能です。
/etc/ansible/hosts
192.168.0.2
192.168.0.3
実行コマンド例は以下の通りです。
第1引数のallで/etc/ansible/hostsに記載されている全ホストを対象とし、
-mオプションで実行モジュールを指定、-aオプションでモジュールに対する引数(ここでは実行するコマンド)を指定します。
[ATDE ~]$ ansible all -m command -a "uptime"
ホストにsshログイン時パスワード入力が必要な場合は、-kオプションを付与します。
[ATDE ~]$ ansible all -m command -a "uptime" -k
結果
192.168.0.2 | CHANGED | rc=0 >>
11:08:42 up 8 min, 2 users, load average: 0.00, 0.05, 0.05
192.168.0.3 | CHANGED | rc=0 >>
11:08:43 up 21 min, 2 user, load average: 0.00, 0.02, 0.03
InventoryとPlaybookを使用した構成管理
Inventoryにホストを、Playbookに制御内容を記載し構成管理を行う例を示します。
Playbookを適用する場合、ansible-playbookコマンドを使用します。
ansible-playbookコマンドの主なオプションは以下の通りです。
オプション | 説明 |
---|---|
-i | inventory指定(存在しない場合は/etc/ansible/hostsを適用) |
-k | sshログイン時にパスワードを入力する |
--ask-become-pass | sudoコマンド用のパスワードを入力する |
Playbookの概要
後程使用しますu-bootとカーネル更新用Playbookの一部を引用し、概要を説明します。
Playbook
---
- hosts: g3m1 # ホストグループを指定
become: yes # スーパーユーザーとして動作する
vars:
uboot_name: u-boot-x1-{{ u_boot_version }}.bin # このファイル内の変数定義
tasks:
- name: copy u-boot file # u-bootのファイルを制御対処ホストへコピー
copy:
src: ./{{ uboot_name }}
dest: /home/atmark/{{ uboot_name }}
:後略
Playbookは yaml形式 で記載します。各アトリビュートの概要は以下の通りです。
- hosts: ホストを指定します。
- vars: このPlaybook内で使用する内部変数を定義します。
- tasks: 処理内容を並べます。
- copy: などの実行命令をモジュールと呼びます。詳細は モジュール定義 を参照ください。
- name: copy:の上部に存在するname:アトリビュートがPlaybook実行時にサーバーの端末に表示されます。これにより、どのモジュールが成功・失敗したかがわかります。
[ATDE ~]$ ansible-playbook -i inventory playbook_~
PLAY [g3m1] ************************************************************************************************************
: 略
TASK [copy u-boot file] ************************************************************************************************
changed: [192.168.0.2]
: 略
Inventoryの概要
Inventoryには、ホストの一覧とグループを記載します。
本Howtoでは、グループ[g3m1]がArmadillo-IoT G3M1、グループ[x1]がArmadillo-IoT X1を想定しています。
コマンドオプション-iでInventoryファイルを指定し、Playbook内のhostsで制御対象を切り替えることができます。
Inventoryファイルを指定しない場合は、/etc/ansible/hostsの内容が適用されます。
Inventoryファイルに記載されている全てのホストを制御したい場合、Playbook内でhosts: allを指定します。
inventory
[g3m1]
192.168.0.2
192.168.0.3
[x1]
192.168.0.4
192.168.2.5
inventoryファイルと以下に示すPlaybookは、本Howtoでは同じディレクトリに配置します。
インターネットからファイルをダウンロードしホストに配置する
インターネット上のファイルをホストのホームディレクトリへ配置するPlaybookです。
get_urlモジュールを使用することでファイルのダウンロードが可能です。
URLが実在しないものになっていますので、運用に合わせて変更してください。
playbook_wget.yml
---
- hosts: g3m1
tasks:
- name: download file
get_url:
url: https://--------/--------
dest: ~/.
実行コマンドは以下の通りです。
[ATDE ~]$ ansible-playbook -i inventory playbook_wget.yml
u-bootとカーネルイメージを更新し再起動する
Armadilloのu-bootとカーネルイメージを更新し、Armadilloを再起動するPlaybookの例です。
事前にu-bootとカーネルイメージを作業ディレクトリーにダウンロードしてください。
変数u_boot_versionとuimage_versionの値はコマンドラインの引数で指定します。
playbook_update_uimage.yml
---
- hosts: g3m1 # ホストグループを指定
become: yes # スーパーユーザーとして動作する
vars:
uboot_name: u-boot-x1-{{ u_boot_version }}.bin # このファイル内の変数定義
tasks:
- name: copy u-boot file # u-bootのファイルを制御対処ホストへコピー
copy:
src: ./{{ uboot_name }}
dest: /home/atmark/{{ uboot_name }}
- name: update u-boot # u-bootのインストールを実施
shell: x1-bootloader-install {{ uboot_name }}
- name: erase file # 使用したファイルを削除
file:
path: /home/atmark/{{ uboot_name }}
state: absent
- name: mount # カーネル更新用にマウント
shell: mount -t vfat /dev/mmcblk2p1 /mnt
args:
warn: no # mountモジュールを使うようにとwarningが出力されますので抑制します。
# mount:
# path: /mnt
# src: /dev/mmcblk2p1
# fstype: vfat
# state: mounted
# boot: false
- name: copy kernel file # カーネルイメージファイルをコピー
copy:
src: ./uImage-x1-{{ uimage_version }}
dest: /mnt/uImage
owner: root
group: root
- name: umount # アンマウント
shell: umount /mnt
# mount:
# path: /mnt
# state: unmounted
- name: do sync # sync実行
shell: sync
- name: reboot # 再起動
shell: reboot
async: 1 # 非同期実行(一旦sshのコネクションが切れるが、それをエラーとしない為の対処)
poll: 0 # 非同期実行時にshellモジュールの戻りを待たない(同上)
- name: wait for reboot # 再起動後のssh再接続待ち
wait_for_connection:
delay: 20 # reboot後20秒後から確認実施
timeout: 300 # 確認タイムアウトは5分
- name: check connection # 導通チェック
ping:
- マウント、アンマウントに関してはAnsibleにmountモジュールが存在しますが、mountモジュールを使用すると/etc/fstabにマウントポイントを記載し、再起動してもマウント状態を永続化してしまう為、期待している一時的にマウントする動作にはなりません。その為、shellモジュールを使用しています。
- #以降はコメントとして扱われます。
実行コマンド例は以下の通りです。
--extra-varsの内容がバージョンに応じて変化します。
[ATDE ~]$ ansible-playbook -i inventory playbook_update_uimage.yml --extra-vars "u_boot_version=at18 uimage_version=v4.9-at8" --ask-become-pass
lighttpdをインストールし再起動する
lighttpdをインストール、index.htmlを配置、debパッケージをインストール、lighttpdを再起動するPlaybookの例です。
debパッケージのURLが実在しないものになっていますので、運用に合わせて変更してください。
playbook_setup_lighttpd_and_deb.yml
---
- hosts: g3m1
become: yes
tasks:
- name: apt install
apt:
name: lighttpd
state: latest
update_cache: yes
- name: put the portal page
template:
src: index.html
dest: /var/www/html/index.html
- name: Install a .deb package from the internet.
apt:
deb: http://--------/--------.deb
- name: restart lighttpd
shell: /etc/init.d/lighttpd restart
実行コマンドは以下の通りです。
[ATDE ~]$ ansible-playbook -i inventory playbook_setup_lighttpd_and_deb.yml --ask-become-pass