かべぎわブログ

ブログです

AnsibleのホストパターンはAND(&)で指定ができる

AnsibleのホストパターンではAND条件で2つのグループに所属するノードのみを対象として実行することが可能です。

概要

例えば以下のような感じで:&で複数グループをつなげてあげます。

$ ansible -i ansible_hosts servers:&develop -m ping

このときインベントリファイルとして利用しているansible_hostsが以下のような内容のとき、serversかつdevelopである192.140.1.1にpingが実行されます。

[servers]
192.140.1.1
192.140.1.2

[develop]
192.140.1.1

[production]
192.140.1.2

実行結果

192.140.1.1にだけpingが実行されていることがわかります。

$ ansible -i ansible_hosts servers:&develop -m ping

192.140.1.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

おわりに

Ansibleのホストパターンは結構いろいろな指定の仕方をしてあげることが可能だったりします。
いろいろとためしてみたくださいね!!!

↓ちなみに以前紹介したやつはこちら

www.kabegiwablog.com

www.kabegiwablog.com

サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

AnsibleでWindows上のzipファイルを展開する

今回はAnsibleでWindows上のzipファイルを展開してみようと思います。

概要

ターゲットのWindowsのtest.zipという名前のzipファイルを展開しています。
今回のplaybookではCドライブ直下においたzipファイルをデスクトップに展開しています。

実行コマンド

$ ansible-playbook -i ansible_hosts windows_unzip.yml

windows_unzip.yml

---
- hosts: target_host
  gather_facts: false

  tasks:
  - name: Unzip
    win_unzip:
      src: C:\test.zip
      dest: C:\Users\Administrator\Desktop\
...

おわりに

zipファイルを展開することができました。
zipにいろいろなものを圧縮してからAnsibleでコピー、展開することで一気に環境を構築することができるかもしれません。
(zipの中身がブラックボックス化するかもしれませんけれど…)

入門Ansible

入門Ansible

Windowsでコマンド一撃で大容量 空ファイルを作成する

Windows環境で一撃で大容量の空ファイルを作成する方法をご紹介します。

実行コマンド

コマンドプロンプトで以下を実行します。

fsutil file createnew C:\5gb_karafile.txt 5368709120

fsutilコマンドでCドライブ直下にファイルを作成しています。
5368709120は10進数で5Gbyteの意味です。

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

[改訂新版]Windowsコマンドプロンプトポケットリファレンス

Ansibleでタグをつかって特定の処理のみ実行する

今回はAnsibleを利用して特定の処理だけを実行する方法をご紹介します。

playbookのいらないところをコメントアウトしていろいろためして…
みたいなことが不要になります!

概要

taskの中にtagsでタグをつけておいて、ansible-playbookコマンドの実行時に--tagsオプションでそのタグを指定してあげます。
すると、タグをつけた処理だけが実行できます!!!

かんたんな例

かんたんな例です。

playbook

playbookが以下だとします。

echoをファイルをリダイレクトするだけのかんたんなplaybookです。
それぞれtagsでwawawaとsasasaのタグをつけてあげています。

---
- hosts: localhost
  gather_facts: false
  tasks:
   - shell: echo "wawawa" > /home/ec2-user/wawawa.txt
     tags: wawawa

   - shell: echo "sasasa" > /home/ec2-user/sasasa.txt
     tags: sasasa
...

実行コマンド

オプションで--tagsを指定してタグがwawawaのものを実行してみます。

$ ansible-playbook -i ansible_hosts ec2_linux_tag_test.yml --tags wawawa

実行結果確認

標準出力は以下のとおり。

$ ansible-playbook -i ansible_hosts ec2_linux_tag_test.yml --tags wawawa
Using /etc/ansible/ansible.cfg as config file

PLAY [localhost] **************************************************************************************************

TASK [command] ****************************************************************************************************
changed: [localhost] => {"changed": true, "cmd": "echo \"wawawa\" > /home/ec2-user/wawawa.txt", "delta": "0:00:00.002605", "end": "2018-02-21 15:24:50.889019", "rc": 0, "start": "2018-02-21 15:24:50.886414", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0   

 
wawawa.txtだけが作成されていることがわかります。

$ cat /home/ec2-user/wawawa.txt 
wawawa

$ cat /home/ec2-user/sasasa.txt 
cat: /home/ec2-user/sasasa.txt: No such file or directory

おまけ

タグは以下のように実行コマンドで複数指定することも可能です。
--tags wawawa--tags sasasaを指定してあげています。

$ ansible-playbook -i ansible_hosts ec2_linux_tag_test.yml --tags wawawa --tags sasasa

また、playbook内のタグが一意である必要はないです。
今回の例の場合、両方ともtags: wawawaとしてあげることで両方とも処理が実行されます。  
たとえばplaybookが以下にような場合、両方の処理が実行されます。

$ cat ec2_linux_tag_test.yml
---
- hosts: localhost
  gather_facts: false
  tasks:
   - shell: echo "wawawa" > /home/ec2-user/wawawa.txt
     tags: wawawa

   - shell: echo "sasasa" > /home/ec2-user/sasasa.txt
     tags: wawawa
...

Ansible実践ガイド 第2版

Ansible実践ガイド 第2版

AnsibleでWindowsのショートカットを作成する

Ansibleを利用してWindowsにショートカットを作成してみます。

今回はためしにInternet Explorerのショートカットを作成してみようと思います。

実行コマンド

$ ansible-playbook -i ansible_hosts win_shortcut.yml

playbookは以下のようにしています。
Internet Explorerのショートカットをデスクトップ上に作成しています。

インベントリファイルは以下のようなかんじ。

[windows]
172.14.1.1

[windows:vars]
ansible_user=kabegiwa
ansible_password=wawawa
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

実行確認

Internet Explorerのショートカットが作成できました! f:id:kabegiwakun:20180221071155p:plain

 

初めてのAnsible

初めてのAnsible

diffで差分がないところだけ出力する

今回はdiffで差分がないところだけ出力してみます。

前提

比較するファイルは以下のようなものを用意しています。

$ cat foo.txt
AAAAA
BBBBB
CCCCC
$ cat bar.txt
CCCCC
DDDDD
EEEEE

実行コマンド

以下のコマンドでdiffで差分のない部分だけを出力することができます。

$ diff --old-line-format='' --unchanged-line-format='%L' --new-line-format='' foo.txt bar.txt
CCCCC

共通部分CCCCCだけが出力できました!

ちょっとした解説

diffにいろいろな長いオプションをつけていてよくわからないと思いますので解説していきます。
まず、今回はdiffのif-then-else形式と呼ばれる形式で差分を表示しています。
(-D--old-line-formatなどのオプションを指定してあげるとその形式になります。)

if-then-else形式とは以下のように比較結果を出力する形式です。

$ diff -D=test foo.txt bar.txt
#ifndef =test
AAAAA
BBBBB
#endif /* ! =test */
CCCCC
#ifdef =test
DDDDD
EEEEE
#endif /* =test */

続いてそれらで利用しているオプションの解説です。
--old-line-format=''は1番目のファイルだけにある行の出力のフォーマットを決めるオプションです。
これを''とすることで出力しないようにしています。

--new-file-format=''も同様です。
2番めのファイルの出力をしないように指定しています。

--unchanged-line-format='%L'は両方のファイルに共通な行を出力する際のフォーマットです。
%Lはman diff曰く

%L contents of line

とのことです。
行の内容をそのまま出力する。という意味で利用しています。

おわりに

共通部分を出力するだけなのにコマンドとしては少し長くなってしまいますが、シェルスクリプト内などで利用すると結構便利だったりするのではないでしょうか?

おためしください!!!

「シェル芸」に効く!AWK処方箋

「シェル芸」に効く!AWK処方箋

オフライン環境でZabbixエージェントをインストールする

今回はオフライン環境のLinuxサーバにZabbixエージェントをインストールしてみます。

手順

なんらかの方法で以下からZabbixエージェントをインストールしてきます。
http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/

なんらかの方法でZabbixエージェントをインストールしたいサーバへダウンロードしてきたファイルを転送します。
(今回はzabbix-agent-3.0.14-1.el7.x86_64.rpmを転送しています)

以下のコマンドを実行して、Zabbixエージェントをインストールします。

$ sudo yum install ./zabbix-agent-3.0.14-1.el7.x86_64.rpm

確認

無事インストールすることができました!

$ yum list installed | grep zabbix
zabbix-agent.x86_64                 3.0.14-1.el7                       installed

コマンドでWindows Serverの起動時に自動ログオンするよう設定する

今回はWindows Serverを起動した際の自動ログオンを実現してみます。

事前準備

マイクロソフト公式からAutoLogonをダウンロードしてきます。
ダウンロードできたら任意の場所に解凍しておきます。

technet.microsoft.com

自動ログオンの設定をする

さて、実際に自動ログオンの設定をしてみます。
AutoLogonを解凍したフォルダに移動し、以下のコマンドを実行します。
(ドメインではない場合はローカルのコンピュータ名を指定してください)

autologon ユーザ名 ドメイン名 パスワード

これだけで完了です!
あとは再起動してあげれば自動でログオンすることが確認できるはずです。

Windows Server 2016 パーフェクトマスター (Perfect Master)

Windows Server 2016 パーフェクトマスター (Perfect Master)

AnsibleでWindowsにAWS CLIをインストールする

今回はAnsibleでWindows環境にAWS CLIをインストールしてみたいと思います。

事前準備

AWS公式からAWS CLIのインストーラをダウンロードしてきます。

aws.amazon.com

以下の赤枠から32ビットまたは64ビットのものをダウンロードします。
f:id:kabegiwakun:20180211160146p:plain

Ansibleを実行する

さて、実際にAnsibleを実行してAWS CLIをインストールしてみます。

実行コマンド

$ ansible-playbook -i hosts/target-hosts install_AWSCLI.yml

playbookは以下のような感じです。

win_copyでインストーラをターゲットノード(AWS CLIをインストールしたいサーバ)にコピーしたあと、win_msiを利用してインストールしています。

おわりに

Ansibleを利用してAWS CLIをインストールすることができました。
msi形式のインストーラであればwin_msiでインストーラのPATHを指定してあげるだけでインストールを行うことができます!

便利ですね!

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Windows環境でPythonをコマンドでサイレントインストールする

今回はWindows環境でPythonをコマンプロンプトなどを利用してサイレントインストールしてみたいと思います。

コマンド

以下のコマンドをコマンドプロンプトで実行することでPyhtonをインストールすることができます。

C:\\python-3.6.3.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0

この例ではPythonのバージョン3.6.3で実施しています。
バージョンの部分は各自読み替えて実行してみてください。

おまけ: Ansibleを利用してPythonをインストールする

サイレントインストールのコマンドをそのままAnsibleのwin_commandに記載してあげればAnsibleを利用してPythonをインストールすることが可能です。

install_python_win.yml

Ansible実践ガイド 第2版

Ansible実践ガイド 第2版

AnsibleでEC2インスタンスを作成してみる

AnsibleでEC2インスタンスを作成してみようと思います。

環境

  • Ansible 2.4.2
  • python 2.7

インスタンスを作成してみる

インスタンスを作成してみます。

実行コマンド

$ ansible-playbook -i ansible_hosts instance_create.yml

playbookは以下のようにしています。

Ansible

インベントリファイルは以下のようなかんじ。

$ cat ansible_hosts
[local]
localhost

実行確認

インスタンスが作成できました! f:id:kabegiwakun:20180208071013p:plain

おわりに

インスタンスを作成するところからAnsibleで実行することができます。
構成管理がはかどりますね!!!

初めてのAnsible

初めてのAnsible

Ansibleのホストパターンは正規表現も利用できる

知らなかったので備忘録的メモです。

Ansibleのホストパターンは正規表現でも利用できました。
例えば以下のように指定が可能です。
正規表現の前には~を忘れないであげてください。

$ ansible -i ansible_hosts "~(test|wawawa)_server" -m ping

このとき、インベントリとして利用しているansible_hostsがこのような内容のとき、test_serverとwawawa_serverにpingが実行されます。

[test_server]
192.140.1.1

[wawawa_server]
192.140.1.2

[sasasa]
192.140.2.1

test_serverとwawawa_serverにpingが実行されていることがわかります。

$ ansible -i ansible_hosts *_server -m ping 
192.140.1.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.140.1.2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Ansible実践ガイド 第2版

Ansible実践ガイド 第2版

Ansibleのホストパターンにはワイルドカードが利用できる

知らなかったので備忘録的メモです。

例えば、以下のように指定が可能です。

$ ansible -i ansible_hosts *_server -m ping

このとき、インベントリとして利用しているansible_hostsがこのような内容のとき、test_serverとwawawa_serverにpingが実行されます。

[test_server]
192.140.1.1

[wawawa_server]
192.140.1.2

[sasasa]
192.140.2.1

test_serverとwawawa_serverにpingが実行されていることがわかります。

$ ansible -i ansible_hosts *_server -m ping 
192.140.1.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.140.1.2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

?も利用できます。

$ ansible -i ansible_hosts ????_server -m ping 
192.140.1.1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Ansible実践ガイド 第2版

Ansible実践ガイド 第2版

Auto Scalingでスケールインしたときの動作まとめ

概要

Auto Scalingを利用していて、スケールインしたときの動きについてまとめてみます。
AWSドキュメントによると、スケールイン時のうごきが以下の通り。

Auto Scaling は、選択したアベイラビリティーゾーンで、保護されていないどのインスタンスが最も古い起動設定を使用しているかを判断します。このよう title:なインスタンスが 1 つある場合、そのインスタンスを終了します。

docs.aws.amazon.com

つまり、古いものから停止されていくので、グループ内で稼働し続けるようなインスタンスは存在しないということになります。

実際に試してみる

Auto Scalingを設定して、実際に動きを確認してみます。

Auto Scaling(スケジュールされたイベント) の設定

設定は以下ようなかんじで設定してみました。

名前 繰り返し 最小 最大
start 5,15,25,35,45,55 * * * * 4 4
stop 0,10,20,30,40,50 * * * * 3 3

startとstopがcronに従って実行され、startで4台にスケールアウト、stopで3台にスケールインするような動きになります。

これでしばらく放置してみます。

実行結果確認

ログを見て、本当に古いインスタンスから削除されているのかを確認します。 ログは以下の実行ログのとおりです。
例えば、直近("StartTime": "2018-02-01T08:10:56.120Z")で停止されたi-ddddddddddddddddを見てみます。

このインスタンスが作成されたのは"StartTime": "2018-01-29T07:35:52.259Z"です。 その時点でのAuto Scaling Groupのインスタンスの起動時刻をそれぞれ表すと以下になります。

インスタンスID 起動時刻
i-ggggggggggggggggg 2018-02-03T08:05:31.933Z
i-fffffffffffffffff 2018-02-03T07:55:38.692Z
i-eeeeeeeeeeeeeeeee 2018-02-03T07:45:45.317Z
i-dddddddddddddddd 2018-02-03T07:35:52.259Z

実際に古いものから削除されているようです!

実行ログ

$  aws autoscaling describe-scaling-activities --auto-scaling-group-name kabegiwa_scaling_group --query 'Activities[].{StartTime:StartTime,Descriprtion:Description}'

[
    {
        "Descriprtion": "Terminating EC2 instance: i-dddddddddddddddd", 
        "StartTime": "2018-02-03T08:10:56.120Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action stop", 
        "StartTime": "2018-02-03T08:10:26.252Z"
    }, 
    {
        "Descriprtion": "Launching a new EC2 instance: i-ggggggggggggggggg", 
        "StartTime": "2018-02-03T08:05:31.933Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action start", 
        "StartTime": "2018-02-03T08:05:00.074Z"
    }, 
    {
        "Descriprtion": "Terminating EC2 instance: i-ccccccccccccccccc", 
        "StartTime": "2018-02-03T08:00:33.408Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action stop", 
        "StartTime": "2018-02-03T08:00:03.635Z"
    }, 
    {
        "Descriprtion": "Launching a new EC2 instance: i-fffffffffffffffff", 
        "StartTime": "2018-02-03T07:55:38.692Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action start", 
        "StartTime": "2018-02-03T07:55:07.006Z"
    }, 
    {
        "Descriprtion": "Terminating EC2 instance: i-bbbbbbbbbbbbbbbbb", 
        "StartTime": "2018-02-03T07:50:40.344Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action stop", 
        "StartTime": "2018-02-03T07:50:10.562Z"
    }, 
    {
        "Descriprtion": "Launching a new EC2 instance: i-eeeeeeeeeeeeeeeee", 
        "StartTime": "2018-02-03T07:45:45.317Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action start", 
        "StartTime": "2018-02-03T07:45:13.995Z"
    }, 
    {
        "Descriprtion": "Terminating EC2 instance: i-aaaaaaaaaaaaaaaaa", 
        "StartTime": "2018-02-03T07:40:47.193Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action stop", 
        "StartTime": "2018-02-03T07:40:17.326Z"
    }, 
    {
        "Descriprtion": "Launching a new EC2 instance: i-dddddddddddddddd", 
        "StartTime": "2018-02-03T07:35:52.259Z"
    }, 
    {
        "Descriprtion": "Executing scheduled action start", 
        "StartTime": "2018-02-03T07:35:20.733Z"
    } 
 ]

おわりに

Auto Scalingでインスタンスを管理すれば、それだけで長期間稼働するインスタンスをなくすことができそうです。

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る

boto3でDynamoDBのテーブルの内容をscanしてすべて取得してみる

boto3を利用してDynamoDBのテーブルの内容をscanしてすべて取得してみたいと思います。

前提

以下のようなテーブルを用意しています。
これをすべてscanして取得します。 f:id:kabegiwakun:20180202064012p:plain

コード

コードは以下の通りです。単純ですね!

python

 
以下のような結果が返ってくるはずです。 (見やすいように整形済み)

{
    'Items': [{
        'name': {
            'S': 'kenkokukinen_no_hi'
        },
        'date': {
            'S': '0211'
        }
    }, {
        'name': {
            'S': 'seijin_no_hi'
        },
        'date': {
            'S': '0108'
        }
    }, {
        'name': {
            'S': 'gantan'
        },
        'date': {
            'S': '0101'
        }
    }],
    'Count': 3,
    'ScannedCount': 3,
}

おわりに

DynamoDBのテーブルの内容をすべて取得することができました。
テーブルの内容を変数に入れて、その内容を参照しに行けばDynamoDBへのアクセスを減らすことができます。

ただし、DynamoDBのデータが多い場合は、scanした際の負荷がかなり高くなると思います。
そこらへんは要検討です。

RDB技術者のためのNoSQLガイド

RDB技術者のためのNoSQLガイド

  • 作者: 渡部徹太郎,河村康爾,北沢匠,佐伯嘉康,佐藤直生,原沢滋,平山毅,李昌桓
  • 出版社/メーカー: 秀和システム
  • 発売日: 2016/02/24
  • メディア: 単行本
  • この商品を含むブログ (3件) を見る