MacにAnsibleを入れてpingを打ってみる(初心者向け)

  • 0
    いいね
  • 0
    コメント

    自分のMacPCにpingしてみます。

    コマンドで実行してみる→hosts書き換えてみる→ playbook書いてみると順を追ってやってみると、Ansibleが分かった気になります。

    Ansibleインストール

    ansible.rb
    $ brew install ansible
    

    バージョン確認。

    ansible.rb
    $ ansible --version
    ansible 2.3.1.0
      config file =
      configured module search path = Default w/o overrides
      python version = 2.7.13 (default, Dec 18 2016, 07:03:39) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
    

    pingを打ってみる

    -mでモジュールを指定してあげます。ここではpingモジュールを使います。
    http://docs.ansible.com/ansible/ping_module.html
    Warningが出ます:unamused:

    ansible.rb
    $ ansible 172.26.3.85 -m ping
     [WARNING]: Host file not found: /usr/local/etc/ansible/hosts
    
     [WARNING]: provided hosts list is empty, only localhost is available
    
     [WARNING]: No hosts matched, nothing to do
    

    デフォルトでインベントリファイルは/usr/local/etc/ansible/hostsをみにいっているのですが、ファイルがないよ!というWarningになります。

    ※インベントリファイルとは、Ansibleで制御したいホストが書いてあるファイルのこと

    ansible.rb
    $ ansible --help
      -i INVENTORY, --inventory-file=INVENTORY
                            specify inventory host path
                            (default=/usr/local/etc/ansible/hosts) or comma
                            separated host list.
    

    確かにファイルない....。

    ansible.rb
    $ ls /usr/local/etc/ansible/
    $
    

    IP指定してコマンド実行してものの、効いていない様子。
    確認したところ、カンマとallをつけてあげれば、/usr/local/etc/ansible/hostsみにいかずに実行してくれます。
    http://dev.classmethod.jp/server-side/ansible/ansible-without-inventory/

    ansible.rb
    $ ansible -i 172.26.3.85, all  -m ping -k
    SSH password:
    172.26.3.85 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    

    hostsファイルを作ります。

    ansible.rb
    $ echo 172.26.3.85  >  /usr/local/etc/ansible/hosts
    $ cat /usr/local/etc/ansible/hosts
    172.26.3.85
    

    再度実行するとエラーになります:unamused:

    ansible.rb
    $ ansible 172.26.3.85 -m ping
    172.26.3.85 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.26.3.85 port 22: Connection refused\r\n",
        "unreachable": true
    }
    

    これはシステム環境設定 -> 共有 -> リモートログイン をオンにすることで解決します。(必要ないときはオフにしておきましょう)
    再度実行すると、また別のエラーになると思います。

    ansible.rb
    $ ansible 172.26.3.85 -m ping
    172.26.3.85 | UNREACHABLE! => {
        "changed": false,
        "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password,keyboard-interactive).\r\n",
        "unreachable": true
    }
    

    これはデフォルトが鍵認証になっているので、設定していないのであれば-kでパスワード認証にする必要があります。

    ansible.rb
    $ ansible 172.26.3.85 -m ping -k
    SSH password:
    172.26.3.85 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    

    pingできました:v:

    hostsをグループ分けしてみる

    インベントリファイルをちょっと書き換えてみます。
    グループ分けして、特定のグループに対してのみ実行も可能。

    ansible.rb
    $ cat /usr/local/etc/ansible/hosts
    [web]
    172.26.3.85
    [db]
    172.26.3.84
    
    

    webにグループにのみ実行します。インベントリファイルとグループを指定してあげます。

    ansible.rb
    $ cd /usr/local/etc/ansible/
    $ ansible -i hosts web  -m ping -k
    SSH password:
    172.26.3.85 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    
    

    実行結果をみると、dbグループの172.26.3.84には実行されていないことが分かります。
    このようにhostsにIPを列挙して、グループ分けすると、用途によって実行対象を変えることができます。

    playbook書いてみる

    YAMLは書きやすいんですがタブ使えなかったり、スペースの位置によってはエラーになるので、初めて書くときは誰かのをコピーして書き換えることをオススメします。
    内容はさっきと同じpingです。

    ansible.rb
    $ cat ping.yml
    ---
    - hosts: web #対象を指定。allは全ホスト
      tasks: #実行するtaskを以下に指定
       - name: pingしてみる #taskの名前
         ping:
    

    ドライランしてみる

    ansible-playbookコマンドを使います。 --checkでドライランできます。

    ansible.rb
    $ ansible-playbook ping.yml -k --check
    SSH password:
    
    PLAY [web] ********************************************************************************************
    
    TASK [Gathering Facts] ********************************************************************************
    ok: [172.26.3.85]
    
    TASK [pingしてみる] ***************************************************************************************
    ok: [172.26.3.85]
    
    PLAY RECAP ********************************************************************************************
    172.26.3.85                : ok=2    changed=0    unreachable=0    failed=0
    
    $
    

    playbook実行してみる

    --checkを外せば実行できます。

    ansible.rb
    $ ansible-playbook ping.yml -k
    SSH password:
    
    PLAY [web] ********************************************************************************************
    
    TASK [Gathering Facts] ********************************************************************************
    ok: [172.26.3.85]
    
    TASK [pingしてみる] ***************************************************************************************
    ok: [172.26.3.85]
    
    PLAY RECAP ********************************************************************************************
    172.26.3.85                : ok=2    changed=0    unreachable=0    failed=0
    
    $
    

    コマンドで実行してみる→hosts書き換えてみる→ playbook書いてみる
    と順を追ってやってみると、Ansibleの基本が掴めると思います。

    -vvvをつけると詳細がみれるので、エラーの際に役に立ちます。

    ansible.rb
    $ ansible -vvv -i 172.26.3.85, all  -m ping -k
    No config file found; using defaults
    SSH password:
    META: ran handlers
    Using module file /usr/local/Cellar/ansible/2.3.1.0/libexec/lib/python2.7/site-packages/ansible/modules/system/ping.py
    <172.26.3.85> ESTABLISH CONNECTION FOR USER: None on PORT 22 TO 172.26.3.85
    <172.26.3.85> EXEC /bin/sh -c 'echo ~ && sleep 0'
    <172.26.3.85> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407 `" && echo ansible-tmp-1499915275.81-233742514524407="` echo /Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407 `" ) && sleep 0'
    <172.26.3.85> PUT /var/folders/3n/0rcp2vd976gd274h0k1zpfc00000gq/T/tmpcul12N TO /Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407/ping.py
    <172.26.3.85> EXEC /bin/sh -c 'chmod u+x /Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407/ /Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407/ping.py && sleep 0'
    <172.26.3.85> EXEC /bin/sh -c '/usr/bin/python /Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407/ping.py; rm -rf "/Users/user/.ansible/tmp/ansible-tmp-1499915275.81-233742514524407/" > /dev/null 2>&1 && sleep 0'
    172.26.3.85 | SUCCESS => {
        "changed": false,
        "invocation": {
            "module_args": {
                "data": null
            }
        },
        "ping": "pong"
    }
    META: ran handlers
    META: ran handlers
    

    超簡単なplaybook置いてます。
    https://gist.github.com/k-iwamoto