Slack Module

初めてのAnsible』を読んで知った表題のModuleを試してみた。

■ 環境

  • Ansible 2.2.1.0

■ Slack Module

Slack – Send Slack notifications – Ansible Documentation
http://docs.ansible.com/ansible/slack_module.html

よくわからなかったのが”token“のところである。

Custom Integrations
https://my.slack.com/apps/manage/custom-integrations

Incoming WebHooks“から作成もしくは既存のものの詳細に記載されている”Webhook URL“から抽出した。自身の環境ではマスクしているが下記のようなURLであった。

https://hooks.slack.com/services/X0X00XX0X/X0XX0XXXX/XXxxxXxXxxxxxxX0x0xxXxxX

https://hooks.slack.com/services/“以降の文字列を”token“に指定したところ、正しく通知された。

icon_emoji“や”username“も指定できるので、playbookが正常に終了した場合にSlackに通知するといったことができるようになった。

    - name: slack notification
      slack:
        token: "X0X00XX0X/X0XX0XXXX/XXxxxXxXxxxxxxX0x0xxXxxX"
        channel: "#test"
        username: "withsin"
        icon_emoji: ":withsin:"
        msg: "テスト。"
      become: no
      delegate_to: localhost

以上。

■ 関連

ansible.cfg

Ansibleの表題のファイルについて。『初めてのAnsible』を読んで知ったことのメモ。

■ 環境

  • Ansible 2.2.1.0
  • Vagrant 1.9.1
  • Mac OSX El Capitan

■ ansible.cfg

Vagrantで稼働させているホストに対して、Ansibleで構築を行っている。以前は`ansible.cfg`の存在を知らなかったので下記のように手打ちでやっていたりした。

$ ansible-playbook -i hosts test.yml

現在は下記のように`ansible.cfg`を設定している。

[defaults]
inventory = hosts
remote_user = vagrant
private_key_file = ~/.vagrant.d/insecure_private_key
host_key_checking = False
retry_files_enabled = False

またVagrantfileには下記を設定している。

Vagrant.configure("2") do |config|
  :
  config.ssh.insert_key = false
  :
end

これで下記のようにアクセスすることができる。

$ ansible-playbook test.yml

`ansible.cfg`では、”inventory“を指定することによりコマンド実行時の`-i`オプションを省略することができる。『初めてのAnsible』では`hostfile`を使用するように記載されていたが、現在は”deprecated“のようなのでこちらの設定を使用するようにした。。また”remote_user“は”vagrant“ユーザをデフォルトで使うようにし、”private_key_file“は指定したファイルを使うようにしている。最近のVagrantはVM毎に異なる鍵が使われるようになっていたが`Vagrantfile`にて`config.ssh.insert_key`を”false“にすることで、このVagrantfileで起動したVMに関しては共通の鍵が使用されるようになっている。また”host_key_checking“を “False“にすることで、VMを何度再作成してもSSH接続時にエラーが起こらないようにしている。最後に”retry_files_enabled“は”False“にしている。失敗した場合はいつも最初から流すようにしているので、retryファイルはほとんど使用していない。邪魔に感じてしまうので作成されないようにしている。

これで随分と楽になった。知らないことは罪である。いや、公式のドキュメントを読まない事が罪である。

Ubuntu 16.04をAnsibleで構築

先日構築したAnsible@AmazonLinuxから表題をしようとしたのだが繋がらない。たいしたことではなかったのだがメモ。

■ 環境

  • Ansible
  • Ubuntu 16.04
  • Amazon Linux

■ Ubuntu

対象のUbuntuは”16.04“である。”ami-eb49358c“を使って起動した。インスタンスの作成時にクイックスタートの一覧に載っているUbuntuのイメージである。

Ubuntuのインスタンスを起動した後、先日構築したAnsible@AmazonLinuxから疎通を確認したところ下記のようになった。

$ ansible 192.168.33.10 -m ping
192.168.33.10 | FAILED! => {
    "changed": false,
    "failed": true,
    "module_stderr": "Shared connection to 192.168.33.10 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "MODULE FAILURE"
}
$

当初はAnsible@AmazonLinux側の設定かと思ったのだが、よく見てみるとどうやら対象のUbuntuにPythonがインストールされていないらしい…。というわけでUbuntuにPythonをインストールする。

$ sudo apt-get update
$ sudo apt-get install python

これで再度、疎通確認をしたところ下記のように正常応答が返ってきた。

$ ansible 192.168.33.10 -m ping
10.1.102.26 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
$

以上。

■ 関連

AmazonLinuxにAnsibleをインストール

表題の通り。前に書いたような気もするのだが、検索してみるとCentOSしか書いていなかったので書いてしまう。

■ 環境

  • Ansible 2.2.1.0
  • Amazon Linux

■ version

ローカルのMacにおけるansibleのversionは下記の通りである。Homebrewでインストールしている。

$ ansible --version
ansible 2.2.1.0
  config file =
  configured module search path = Default w/o overrides
$

できればこのversionにAmazonLinuxでも合わせたい。

■ Amazon Linux

とりあえず検索。

$ sudo yum search ansible
読み込んだプラグイン:priorities, update-motd, upgrade-helper
警告: 一致するものが見つかりません: ansible
No matches found
$

だそうである。ではEPELレポジトリで確認する。

$ sudo yum --enablerepo=epel search ansible
読み込んだプラグイン:priorities, update-motd, upgrade-helper
981 packages excluded due to repository priority protections
================== N/S matched: ansible ===========================
ansible-inventory-grapher.noarch : Creates graphs representing ansible inventory
ansible-lint.noarch : Best practices checker for Ansible
python2-ansible-tower-cli.noarch : A CLI tool for Ansible Tower
ansible.noarch : SSH-based configuration management, deployment, and task execution system
ansible1.9.noarch : SSH-based configuration management, deployment, and task execution system

  Name and summary matches only, use "search all" for everything.
$

EPELレポジトリには存在するようだ。versionを確認する。

$ sudo yum --enablerepo=epel info ansible
読み込んだプラグイン:priorities, update-motd, upgrade-helper
981 packages excluded due to repository priority protections
インストール済みパッケージ
名前           : ansible
アーキテクチャー   : noarch
バージョン       : 2.2.1.0
リリース         : 1.el6
容量           : 22 M
リポジトリー      : installed
提供元リポジトリー : epel
要約           : SSH-based configuration management, deployment, and task execution system
URL           : http://ansible.com
ライセンス      : GPLv3+
説明          :
             : Ansible is a radically simple model-driven configuration management,
             : multi-node deployment, and remote task execution system. Ansible works
             : over SSH and does not require any software or daemons to be installed
             : on remote nodes. Extension modules can be written in any language and
            : are transferred to managed machines automatically.

$

versionもMacに入れていたものと変わらない。これをインストールする。

$ sudo yum --enablerepo=epel install ansible

インストールできた。

$ ansible --version
ansible 2.2.1.0
  config file = 
  configured module search path = Default w/o overrides
$

以上。

■ 関連

Ansibleのfailモジュール

表題の通り。Ansibleのcoreモジュールのひとつであるfailモジュールを使う。

■ 環境

  • ansible 1.9.2

■ きっかけ

実行対象ホストのOSが対象外であった場合に以降のタスクを全て実行させたくない、というplaybookを書きたかったのだが、どうやれば良いのかいまいちわかっていなかった。

そういえば”failed_when“と書くことができるな…ということは”fail“させれば良いのか、と思い出し、ドキュメントをちゃんと見てみると”failモジュール“の存在を知った。”when“と共に書けば実現できそうである。

■ fail module

Docs >> fail – Fail with custom message
http://docs.ansible.com/ansible/fail_module.html

自身の場合は、”gather_facts“で収集した情報からOSに関する情報を取得し判断材料としている。

- name: OS check
  fail: msg="not supported."
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version|int < 7

上記は、CentOS 7以外は全てfailさせ実行を終了させている。

とりあえずやりたい事は実現できたので良しとする。

以上。

■ 関連