かべぎわブログ

ブログです

Ansibleのreplaceモジュールをつかって文字列を置換してみる

概要

Ansibleのreplaceモジュールを利用して、テキストファイルなどの文字列を置換してみようと思います。

playbook例

ちょっとした説明

destで置換したいファイルを指定します。
regexpで置換したい文言を指定します(正規表現可)
replaceで置換後の文言を指定します。
backupを指定してあげると置換前のファイルのバックアップを作ってくれます。

実行してみる

$  ansible-playbook replace.yml

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

TASK [replace text file] *************************************************************************************************************************************
changed: [localhost] => {"backup_file": "/home/ec2-user/wawawa.txt.4479.2018-04-30@14:37:14~", "changed": true, "msg": "3 replacements made"}

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

こんなファイルが

$ cat ./wawawa.txt.4479.2018-04-30@14:37:14~
AAA
BBB
CCC
AAAA
AAAAA
CCC123

こうなります。

$ cat wawawa.txt
wawawa
BBB
CCC
wawawa
wawawa
CCC123

ちなみに./wawawa.txt.4479.2018-04-30@14:37:14~というのがバックアップファイルです。

おわりに

置換できました!!!!!

初めてのAnsible

初めてのAnsible

Ansibleでcronを設定してみる

概要

Ansibleのcronモジュールを利用してcrontabを設定してみようと思います。

playbook例

以下のように設定しています。
minutehourなどにcronで実行したい時間を設定します。
省略すると*扱いとなります。

jobは実行したいコマンドです。

実行してみる

$  ansible-playbook cron.yml -v

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

TASK [set crontab] *******************************************************************************************************************************************
changed: [localhost] => {"changed": true, "envs": [], "jobs": ["test_execute"]}

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

cronが設定されていることがわかります。

$ crontab -l
#Ansible: test_execute
0 1,3 10 5 1-5 /home/ec2-user/wawawa.sh

おわりに

cronを設定することができました。
cronモジュールを利用することでcrontab = playbookにすることが可能なのでcrontabのコード化(?)が可能かと思います。
(cronもコードやんけというかんじもありけり)

Ansible実践ガイド 第2版 (impress top gear)

Ansible実践ガイド 第2版 (impress top gear)

Ansibleのhostnameモジュールでホスト名を変更する

概要

Ansibleのhostnameモジュールを利用してサーバのホスト名を変更してみます。

playbook例

こんなかんじで自分自身のホスト名をwawawa_serverに変更しています。
become: trueで実行しないと権限の関係で変更ができない可能性があるので要注意です。

実行してみる

$ hostname
test_server

$  ansible-playbook hostname.yml

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

TASK [set hostname] ******************************************************************************************************************************************
changed: [localhost] => {"ansible_facts": {"ansible_domain": "", "ansible_fqdn": "wawawa_server", "ansible_hostname": "wawawa_server", "ansible_nodename": "wawawa_server"}, "changed": true, "name": "wawawa_server"}

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

$ hostname
wawawa_server

おわりに

ホスト名へんこうできましたね

Ansible実践ガイド 第2版 (impress top gear)

Ansible実践ガイド 第2版 (impress top gear)

Ansibleのexpectで対話型のスクリプトを実行してみる

概要

Ansibleのexpectを利用して対話型のスクリプトを実行してみようと思います。

準備

Ansibleでexpectモジュールを利用するためにはpexpectのインストールが必要です。
以下のコマンドでインストールしておきます。

$ sudo pip install pexpect

playbook例

以下のようなかんじでexpectの下に実行したいコマンドを記載します。
また、responsesで対話型の待受メッセージとそれに対する答えを入力します。
待受メッセージの箇所には正規表現が利用できます。

対話型スクリプト例

こんなかんじのスクリプトをplaybookの中から実行してみます。

実行してみる

実行するとこんな感じです。
wawawaを実行しました と出力されていることがわかります。

$  ansible-playbook expect.yml -v


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

TASK [wget] **************************************************************************************************************************************************
changed: [localhost] => {"changed": true, "cmd": "/home/ec2-user/taiwa.sh", "delta": "0:00:00.155081", "end": "2018-04-29 12:50:29.027492", "rc": 0, "start": "2018-04-29 12:50:28.872411", "stdout": "実行するコマンドを入力してください\r\nwawawa を実行しました", "stdout_lines": ["実行するコマンドを入力してください", "wawawa を実行しました"]}

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

おわりに

対話型のスクリプトをAnsibleで実行することができました。
結構かっちりresponsesでやりとりを記載してあげなければいけないので面倒ではありますが、こういったものもAnsibleをつかって自動化することができそうです!!!

Ansible実践ガイド 第2版 (impress top gear)

Ansible実践ガイド 第2版 (impress top gear)

readコマンドで対話的なシェルスクリプトをつくる

概要

readという標準入力を1行読み込むことのできるコマンドを利用して対話的なシェルスクリプトを作ってみようと思います。

スクリプト

スクリプトはこんなかんじ

ちょっとした説明

readコマンドを利用して標準出力を読み込んで変数に格納しています。
それをechoで出しているだけです。かんたんですね!!!

実行してみる

$ ./taiwa.sh 
実行するコマンドを入力してください
wawawa
wawawa を実行しました

まとめ

対話的なシェルスクリプトをつくることができました!

ただ、こういったシェルスクリプトをつくってしまうとパイプで結果を渡したりできなくなってしまうのであんまり利用しないほうがいいかもしれないです。

シェルプログラミング実用テクニック

シェルプログラミング実用テクニック

ホテイのじゃがベーコンブラックペッパー味の缶詰がハイパーうまい

ホテイのじゃがベーコンブラックペッパー味がハイパーうまいです。

外観はこんなかんじ
f:id:kabegiwakun:20180505175125p:plain

内観はこんなかんじ f:id:kabegiwakun:20180505175148p:plain

じゃがいもはこんなかんじ
ハイパー味が濃い
f:id:kabegiwakun:20180505175215p:plain

ベーコンはこんなかんじ
やわらかい
f:id:kabegiwakun:20180505175240p:plain



おわり

ホテイフーズ じゃがベーコン ブラックペッパー味 90g×4個

ホテイフーズ じゃがベーコン ブラックペッパー味 90g×4個

Ansibleのバージョンを指定してインストールする

概要

Ansibleの特定のバージョンをインストールする方法をご紹介します!

バージョンを指定してインストール

たとえば、バージョン2.4.3をインストールする場合は以下のコマンドのようにバージョンを指定してpip installを実行します。

$ sudo pip install ansible\==2.4.3

確認してみる

ちゃんとAnsible ver2.4.3がインストールされていました。

$ ansible --version
ansible 2.4.3.0

まとめ

Ansibleの特定のバージョンをインストールすることができました。
検証のために最新版ではなく特定のバージョンで動作させたいといった場合などに役に立つかと思います。

Ansible実践ガイド 第2版 (impress top gear)

Ansible実践ガイド 第2版 (impress top gear)

Ansibleのblock内のalwaysの動きを確認してみる

概要

Ansibleのblockのなかでalwaysディレクティブを指定してみて動きを確認してみます。

alwaysの説明

alwaysblock内で指定できるディレクティブで、その名の通りいつでも実行される処理です。
タスクが成功しても失敗しても実行されるため、エラーハンドリングなどに利用することができます。

確認してみる

shell./sonzaisinaiという存在しないコマンドを実行するように設定し、failedになってもalwaysがちゃんと実行されるかどうか確認してみます。

playbook

実行結果

alwaysがちゃんと実行されていることがわかります!

$  ansible-playbook block_always.yml

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

TASK [command] ************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "./sonzaisinai", "delta": "0:00:00.002666", "end": "2018-04-12 22:22:17.968083", "msg": "non-zero return code", "rc": 127, "start": "2018-04-12 22:22:17.965417", "stderr": "/bin/sh: ./sonzaisinai: No such file or directory", "stderr_lines": ["/bin/sh: ./sonzaisinai: No such file or directory"], "stdout": "", "stdout_lines": []}

TASK [debug] **************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "always実行"
}
    to retry, use: --limit @/home/ec2-user/block_always.retry

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

おわりに

alwaysもべんり


Ansible実践ガイド第2版 impress top gearシリーズ

Ansible実践ガイド第2版 impress top gearシリーズ

Ansibleのblock内のrescueの動きを確認してみる

概要

Ansibleのblock のなかでrescureディレクティブを指定してみて動きを確認してみます。

そもそものrescueの説明

rescueblock内で定義したタスクのどれかがエラーになったときに実行する処理を記載することができるディレクティブです。
タスクが失敗したときの後処理として利用することができます。

rescueが実行されるパターンを確認してみる

以下のplaybookを利用してrescueを確認してみます。
shell./sonzaisinaiという存在しないコマンドが実行され、エラーとなるようにしています。

実行結果

./sonzaisinaiなんてものは存在しないのでエラーになり、resucueが実行されていることがわかります。

$  ansible-playbook block_rescue.yml

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

TASK [command] ************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "./sonzaisinai", "delta": "0:00:00.002727", "end": "2018-04-12 22:00:29.890869", "msg": "non-zero return code", "rc": 127, "start": "2018-04-12 22:00:29.888142", "stderr": "/bin/sh: ./sonzaisinai: No such file or directory", "stderr_lines": ["/bin/sh: ./sonzaisinai: No such file or directory"], "stdout": "", "stdout_lines": []}

TASK [debug] **************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "rescue実行"
}

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

rescueが実行されないパターンを確認してみる

shelllsコマンドを実行するようにしてみます。
lsはなんの問題もなく実行されるはずなのでエラーにはならない想定です。

実行結果

lsがなんの滞りもなく完了し、rescueが実行されていないことがわかります。

$  ansible-playbook block_rescue_ok.yml


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

TASK [command] ************************************************************************************************************************************************
changed: [localhost]

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

おわりに

rescueはべんり


Ansible実践ガイド第2版 impress top gearシリーズ

Ansible実践ガイド第2版 impress top gearシリーズ

Ansibleでblockをつかってtagsを集約する

概要

Ansibleのblockを利用してtagsで実行するタスクを集約してみたいと思います。

playbook例

こんなかんじでblockでまとめることができます。


blockをつかわないとこんなかんじで毎回tagsを記載する必要がありました。

実行結果

blockでまとめたplaybookを実行してみるとshellモジュールが2つとも実行されていることがわかります。

$  ansible-playbook block_tags.yml --tags wawawa

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

TASK [command] ***********************************************************************************************************************************************
changed: [localhost]

TASK [command] ***********************************************************************************************************************************************
changed: [localhost]

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

おわりに

おわり


Ansible実践ガイド第2版 impress top gearシリーズ

Ansible実践ガイド第2版 impress top gearシリーズ

Ansibleのwith_nestedの動きを確認してみる

概要

with_nestedディレクティブをつかうと2つ以上の配列をまわすことができます。

playbook例

こんなかんじのplaybookでwith_nestedされた結果をdebugで出力してみます。

動きを見てみる

実際に実行してみて動きを見てみます。

  ansible-playbook -i ansible_hosts with_nested.yml 

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

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [localhost]

TASK [with_nested test] **********************************************************************************************************************
ok: [localhost] => (item=[u'AAA', u'111']) => {
    "<type 'list'>": "VARIABLE IS NOT DEFINED!", 
    "changed": false, 
    "item": [
        "AAA", 
        "111"
    ]
}
ok: [localhost] => (item=[u'AAA', u'222']) => {
    "<type 'list'>": "VARIABLE IS NOT DEFINED!", 
    "changed": false, 
    "item": [
        "AAA", 
        "222"
    ]
}
ok: [localhost] => (item=[u'AAA', u'333']) => {
    "<type 'list'>": "VARIABLE IS NOT DEFINED!", 
    "changed": false, 
    "item": [
        "AAA", 
        "333"
    ]
}
ok: [localhost] => (item=[u'BBB', u'111']) => {
    "<type 'list'>": "VARIABLE IS NOT DEFINED!", 
    "changed": false, 
    "item": [
        "BBB", 
        "111"
    ]
}
ok: [localhost] => (item=[u'BBB', u'222']) => {
    "<type 'list'>": "VARIABLE IS NOT DEFINED!", 
    "changed": false, 
    "item": [
        "BBB", 
        "222"
    ]
}
ok: [localhost] => (item=[u'BBB', u'333']) => {
    "<type 'list'>": "VARIABLE IS NOT DEFINED!", 
    "changed": false, 
    "item": [
        "BBB", 
        "333"
    ]
}

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

2つの配列のすべての組み合わせでループされていることがわかります。

おわりに

Ansibleのループがらみは意外といろいろありますよね。


入門Ansible

入門Ansible

Ansibleのwith_itemsで複数の変数を利用する

概要

Ansibleのwith_itemsディレクティブで複数の変数を利用する方法をご紹介します。

playbook例

こんなかんじでwith_itemsの項目を{}で囲ってあげます。

実行例

msgの部分を見るとちゃんと指定したとおりに出力されていることがわかる。

$  ansible-playbook -i ansible_hosts with_items_2.yml
PLAY [localhost] *****************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [localhost]

TASK [名字だけ] **********************************************************************************************************************************
ok: [localhost] => (item={u'myouji': u'tanaka', u'namae': u'tarou'}) => {
    "changed": false, 
    "item": {
        "myouji": "tanaka", 
        "namae": "tarou"
    }, 
    "msg": "tanaka"
}
ok: [localhost] => (item={u'myouji': u'yamada', u'namae': u'jirou'}) => {
    "changed": false, 
    "item": {
        "myouji": "yamada", 
        "namae": "jirou"
    }, 
    "msg": "yamada"
}

TASK [フルネーム] *********************************************************************************************************************************
ok: [localhost] => (item={u'myouji': u'tanaka', u'namae': u'tarou'}) => {
    "changed": false, 
    "item": {
        "myouji": "tanaka", 
        "namae": "tarou"
    }, 
    "msg": "(u'tanaka', u'tarou')"
}
ok: [localhost] => (item={u'myouji': u'yamada', u'namae': u'jirou'}) => {
    "changed": false, 
    "item": {
        "myouji": "yamada", 
        "namae": "jirou"
    }, 
    "msg": "(u'yamada', u'jirou')"
}


PLAY RECAP ***********************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0   

おわりに

複数個でもできるということだ。


入門Ansible

入門Ansible

Ansibleのwith_itemsで一気にいろいろyumインストールする

概要

Ansibleのwith_itemsディレクティブというループ処理(シーケンシャル呼び出し処理)を実行できるものを利用して、いろいろ一気にyum installしてみたいと思います。

playbook例

playbookはこんなかんじです。
今回の例ではdockernginxをインストールしようとしています。
with_itemsに定義した項目は{{ item }}変数に代入されます。
そのため処理としてはyum: name=docker-ioyum: name=nginxが実行されることになります。

実行結果

このplaybookを実行してみるとこんなかんじです。
changedはいくらループをまわしても1つとしてカウントされるので要注意です。

$  ansible-playbook -i ansible_hosts yum_with_items.yml

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

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [localhost]

TASK [yum install] ***************************************************************************************************************************
changed: [localhost] => (item=[u'docker-io', u'nginx'])

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

実際にインストールされました!

$ sudo yum list installed | grep docker
docker.x86_64                      17.06.2ce-1.102.amzn2             @amzn2-core

$ sudo yum list installed | grep nginx
nginx.x86_64                       1:1.12.2-2.el7                    @epel      
nginx-all-modules.noarch           1:1.12.2-2.el7                    @epel      
nginx-filesystem.noarch            1:1.12.2-2.el7                    @epel      
nginx-mod-http-geoip.x86_64        1:1.12.2-2.el7                    @epel      
nginx-mod-http-image-filter.x86_64 1:1.12.2-2.el7                    @epel      
nginx-mod-http-perl.x86_64         1:1.12.2-2.el7                    @epel      
nginx-mod-http-xslt-filter.x86_64  1:1.12.2-2.el7                    @epel      
nginx-mod-mail.x86_64              1:1.12.2-2.el7                    @epel      
nginx-mod-stream.x86_64            1:1.12.2-2.el7                    @epel   

おわりに

with_itemsを利用して一気にyum installすることができました。
ループ処理を使うことでplaybookを短くわかりやすく記述することができるようになるかと思います。


入門Ansible

入門Ansible

Ansibleでshellをつかってもchanged_whenで絶対にchangedにしない

概要

Ansibleでshellcommandモジュールを利用すると、結果が常にchangedになってしまいます。
なんか気持ち悪いなーということで絶対にchangedにしない方法です。

playbook例

changed_when: Falseとすることで絶対にchangedにはならなくなります。

実行例

実行するとこんなかんじ。

$  ansible-playbook -i ansible_hosts always_ok.yml


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

TASK [ls] ************************************************************************************************************************************
ok: [localhost]

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

おわりに

Ansibleの冪等性維持のためにcommandとかshellとかはあんまりつかわないほうがいいと思うんだけれども使わなきゃいけなくなったかつなんかごまかしたいときにおすすめの記述方法です。

だれにおすすめかはわからないけど。


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

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

cd - で一つ前にいたディレクトリに戻る

概要

cd -コマンドを利用することで一つ前に自分が居たディレクトリに戻ることができます。

コマンド例

$ pwd
/Users/kabegiwa/Downloads

$ cd
$ pwd
/Users/kabegiwa

$ cd -
/Users/kabegiwa/Downloads

おわりに 

これでまちがってcd実行してホームディレクトリにもどちゃってわーーー
みたいなときにも大丈夫ですね!!!

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)