InventoryFileに同名のホストを複数行書いてはいけない

Ansibleにおいて表題の通り。

■ 環境

  • Ansible 2.5.3
  • Vagrant 2.0.3
  • macOS High Sierra

■ きっかけ

開発やテスト用にVagrantを使用しているのだが、何度も作成したり削除したりを繰り返しているうちに、InventoryFileがごちゃ混ぜになってしまった。複数のVMを使用していることもあり、Ansibleのplaybookを試す際にグループを変えて試したり…と。

その中である時下記のようなエラーが。

$ ansible group1 -m ping
host01 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.\r\nvagrant@127.0.0.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\r\n",
    "unreachable": true
}
$

接続ができない!?

InventoryFileを確認してみると該当行は特に問題はなさそう。`vagrant ssh host01`でもログインが可能である。

よくよくメッセージを読んでみると、今回起動したVMのPortが違う気がする。改めてInventoryFileを確認してみると別のグループに同名で記載されてしまっていた。

$ cat hosts
  :
[group1]
host01 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2201
  :
[group3]
host01 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
  :

どうやら下に記載されていた設定で上書きされていたようである。複数行あった記載を1行のみに編集したところ問題なく使用できた。

以上。

ファイルを配布

Ansibleにおいて表題を行いたい。playbookを書くほどの内容では無いので手軽に行いたい。

■ 環境

  • Ansible 2.3.1.0

■ ansible

playbookを実行するのは`ansible-playbook`コマンドであるが、単に対象のホスト群でコマンド等を実行したいだけの場合には`ansible`コマンドで行う。普段自身が`ansible`コマンドを利用するのは下記のように使うことがほとんどである。

$ ansible all -m ping

グループを絞ってアクセスしたりしているくらいである。今回は対象のホストが多かったので1台ずつ手作業で…なんてことをする気にはなれず、このコマンドを用いてファイルを配布したい。

$ ansible group1 -m copy -a "src=[ローカルのファイル] dest=[対象ホスト上で配置するパス]"

playbookに書くときと同じ内容である。ちなみに上記はansibleでの接続ユーザを指定している場合にはそのユーザで作成される。自身の環境では接続ユーザは一般ユーザであり、ファイルを配置したいのはrootユーザであったので下記のように実行した。

$ ansible group1 -m copy -a "src=[ローカルのファイル] dest=[対象ホスト上で配置するパス]" --become

下記の内容を参照した。

File Transfer
http://docs.ansible.com/ansible/latest/intro_adhoc.html#file-transfer

Parallelism and Shell Commands
http://docs.ansible.com/ansible/latest/intro_adhoc.html#parallelism-and-shell-commands

以上。

service enabled

Ansibleにおいて表題のモジュールとオプションについて。知らなかったのでメモ。

■ 環境

  • Ansible 2.4.1.0

■ きっかけ

とあるansibleで構築した環境において、再起動された際に起動していないサービスがあった。しばらく気がつかずに放置してしまっていた。

ansibleのroleを使っているのだが、その中の下記のファイルでserviceを再起動するように書いている。

$ cat roles/serviceA/handlers/main.yml
---
- name: restart
  service:
    name: serviceA
    state: restarted
$

しかしこれではplaybookの実行時に、変更があった場合にserviceを再起動するだけの設定であった。いわゆる下記のようなことをやりたかった。

$ sudo chkconfig --add serviceA

調べてみると、”service“モジュールでそのまま設定ができるようであったので下記のように変更した。

$ cat roles/serviceA/handlers/main.yml
---
- name: restart
  service:
    name: serviceA
    enabled: yes
    state: restarted
$

これで自動起動が入った。

以上。

■ 関連

service – Managed Services. — Ansible Documentation
http://docs.ansible.com/ansible/latest/service_module.html

ansible_os_family/ansible_pkg_mgr

Ansibleにおいて表題の件について。

■ 環境

  • Ansible 2.3.1.0

■ ansible -m setup

$ ansible [対象] -m setup

このコマンドで”gather_facts“で収集している情報がどういうものか取得できる。

自信が”task“の中でよく使用する表題の項目についても下記のように取得できている。

CentOSの場合

$ ansible host1 -m setup
  :
        "ansible_lsb": {
            "codename": "Final",
            "description": "CentOS release 6.9 (Final)",
            "id": "CentOS",
            "major_release": "6",
            "release": "6.9"
        },
  :
        "ansible_os_family": "RedHat",
        "ansible_pkg_mgr": "yum",
  :
$

Ubuntuの場合

$ ansible host2 -m setup
  :
        "ansible_lsb": {
            "codename": "xenial",
            "description": "Ubuntu 16.04.2 LTS",
            "id": "Ubuntu",
            "major_release": "16",
            "release": "16.04"
        },
  :
        "ansible_os_family": "Debian",
        "ansible_pkg_mgr": "apt",
  :
$

以上。

SSHユーザを指定

Ansibleにおいて表題の通り。

■ 環境

  • Ansible 2.3.1.0
  • Mac OSX El Capitan

■ ansible.cfg

開発環境で主に使うので、”ansible.cfg“には下記を書いている。

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

いざ開発したものを試しに別環境にやってみようかと思うと、”ansible.cfg“の設定が優先されてしまうのでたまに困ることがある。

よって”hosts“に下記のように”variable“として書くことにしている。

$ cat hosts
  :
[group1]
host001
host002

[group1:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_user=root
$

host001“等は”~/.ssh/config“の方に書いている。

もうちょっとうまい方法はないのであろうか。

以上。

■ 関連

ansible_ssh_private_key_file

InventoryFileでグループ変数