ファイルを配布

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でグループ変数

複数のホストグループを指定

Ansibleにおいて表題の通り。先日のエントリでは1ホストグループに対して実行していたのだが、複数のグループの時にはどうしたら良いのか、というのを試したメモ。

■ 環境

  • Ansible 2.3.1.0

■ ansible-playbook

親子関係のグループで子のグループにのみ実行したいのだが、その子グループが複数ある。複数の子グループを同時に実行したい。

$ ansible-playbook -l group1 example.yml

上記でホストグループを指定することが可能なので、複数やるには?とマニュアルも読まずに実行してみた。

$ ansible-playbook -l group1 -l group2 example.yml

上記では”group2“でのみ実行された。最後に指定したものが優先されてしまうようである。

$ ansible-playbook -l group1,group2 example.yml

上記のようにリスト形式で指定すると、思い通りの結果が得られた。

以上。

■ 関連

playbook実行時にホストグループを指定

グループの親子関係