MacにAnasibleをインストール・設定、使えるようになるまで

2019.10.4 (金)

Python3でAnsibleが使えるようにします。以下、参考。

ここでやること

  • Macへansibleをインストール
  • リモートホストへの接続
  • userでのHello world.
  • root(sudo)でのHello world.

Install

Macにインストールするには、brew使うのがいちばんいいと思います。brewを更新、またはアップデートしておきます。Doctorもやっておいてエラーなどを解消しておいた方がいいです。

$ brew update
$ brew doctor
$ brew upgrade

現行でインストールできるansibleを確認します。

$ brew info ansible
ansible: stable 2.8.5 (bottled), HEAD
Automate deployment, configuration, and upgrading
https://www.ansible.com/
/usr/local/Cellar/ansible/2.8.5 (15,848 files, 200.2MB) *
  Poured from bottle on 2019-10-02 at 05:56:39
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ansible.rb
==> Dependencies
Build: pkg-config ✔
Required: libyaml ✔, openssl@1.1 ✔, python ✔
==> Options
--HEAD
    Install HEAD version
==> Analytics
install: 37,343 (30 days), 99,483 (90 days), 371,584 (365 days)
install_on_request: 35,109 (30 days), 93,685 (90 days), 343,607 (365 days)
build_error: 0 (30 days)

ansible 2.8.5が入るっぽい。

$ brew install ansible

バージョン確認

$ ansible --version
ansible 2.8.5

これで終わり。
簡単なansibleコマンドを実行してみます。

$ ansible -m ping localhost

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

SUCCESSが返ってきたらOKです。

Ansibleのコマンド

結構いっぱいあります。dockerとかもいっぱいあるし、terraformもいっぱいありますが、ansibleで使うのは基本的にはansibleansible-playbookになります。

ansible
ansible-connection
ansible-doc
ansible-inventory
ansible-pull
ansible-config
ansible-console
ansible-galaxy
ansible-playbook
ansible-vault

公式ドキュメントは、今回は2.8でやってゆくのでここになります。各バージョンのドキュメントがあるので見てみてください。
Ansible 2.8 Porting Guide
ヘルプはいつもの感じ。

$ ansible --help

Hello world 的なもの

アクセス先のサーバーを定義してansibleを実行します。
ansileはSSH接続でコネクトしそのサーバーに設定を実行します。SSH接続の設定自体はansibleとは独立したものなので、別で設定しておいてください。鍵にパスフレーズをつけないで発行した方がやりやすいです。また.ssh/configに設定しておいて、ショートカットでアクセスできるようにしておいてください。
本家のDocumentにも詳しい接続の方法が解説されています。ドキュメント > ユーザーガイド > 入門 > はじめに

#.ssh/config
Host ansile.example.com
HostName 123.xxx.xxx.xxx
User ansible
Port 22
IdentityFile ~/.ssh/SSHKEY.pem

みたいにしておけばよいと思います。
このSSHの設定をansibleで動かせるように例にならってinventryディレクトリを作成してその中に格納します。

$ cd WORK_DIR ←適当な作業ディレクトリを作って移動
$ mkdir inventory
$ touch inventory/hosts
$ vi inventory/hosts

ターゲットのホストを書きます。

[targets]
ansile.example.com

このホストはansibleと同じ実行ユーザーでSSH接続できるように予め設定しておいてください。
リモートホストに向けてansibleします。

$ ansible all -i inventory/hosts -m ping

ansible.example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

これでOKです。

サーバーの設定をしてみる Playbookを使う

では、簡単なコマンドを実行してみます。先ほどのinventory/hostsを使ってmain.ymlを実行します。ファイルの中身はいたってシンプルにしておきましょう。

- hosts: targets
  user: user
  tasks:
    - name: output message.
      debug: msg="Hello world."

「Hello world.」を表示するだけの至ってシンプル。

$ ansible-playbook --check -i inventory/hosts main.yml

rootで実行する

rootで実行するのはリモートホストにrootでのSSH接続をするのがいちばんてっとり早いといえばそうなのですが、それはあまりよいアイディアではないので普通にsudoした方がよいです。おそらくデフォルトでプラグインがインストールされていると思うのでsudoもすぐに使えるようになっているはずです。
プラグインを確認してみます。

$ ansible-doc -t become -l

doas       Do As user                                                                                                                            
dzdo       Centrify's Direct Authorize                                                                                                           
enable     Switch to elevated permissions on a network device                                                                                    
ksu        Kerberos substitute user                                                                                                              
machinectl Systemd's machinectl privilege escalation                                                                                             
pbrun      PowerBroker run                                                                                                                       
pfexec     profile based execution                                                                                                               
pmrun      Privilege Manager run                                                                                                                 
runas      Run As user                                                                                                                           
sesu       CA Privileged Access Manager                                                                                                          
su         Substitute User                                                                                                                       
sudo       Substitute User DO                       

こんな感じで一覧が見れるので確認してみてください。

sudoで実行する

main.ymlを書き換えてsudoで実行できるようにします。becomeメソッドで実行ユーザーを定義します。

- hosts: targets
  remote_user: user
  become: yes
  become_user: root
  become_method: sudo
  tasks:
    - name: output message.
      debug: msg="sudo: Hello world."

これでroot権限相当の実行が可能になります。
とはいえ、sudoで実行できるように予めサーバー側に設定シておく必要があります。(※これはterraformなんかで予め設定しておいた方がよいと思います)
実行します。

ansible-playbook -i inventory/hosts main.yml

TASK [output message.]で”sudo: Hello world.”が表示されればOKです。