Chapter 07

アドホックコマンド

y_mrok
y_mrok
2021.10.17に更新

インベントリーファイルができあがると、ansible コマンドを使用してアドホックコマンドを実行できます。

使用するインベントリーファイル

y_mrok@ctrl:~/code/exam3$ tree
.
├── group_vars
│   ├── all.yml
│   └── web.yml
├── host_vars
│   ├── ebisugawa.yml
│   ├── marutamachi.yml
│   ├── nijyo.yml
│   ├── oike.yml
│   ├── oshikoji.yml
│   └── takeyamachi.yml
└── hosts.yml

2 directories, 9 files
y_mrok@ctrl:~/code/exam3$ 
hosts.yml
---
all:
  hosts:
    marutamachi:
  children:
    web:
      hosts:
        takeyamachi:
        ebisugawa:
        nijyo:
    mail:
      hosts:
        nijyo:
    database:
      hosts:
        oshikoji:
        oike:
host_vars/marutamachi.yml
---
ansible_host: 192.168.111.101
host_vars/takeyamachi.yml
---
ansible_host: 192.168.111.102
host_vars/ebisugawa.yml
---
ansible_host: 192.168.111.103
host_vars/nijyo.yml
---
ansible_host: 192.168.111.104
host_vars/oshikoji.yml
---
ansible_host: 192.168.111.105
ansible_python_interpreter: /usr/bin/python3
host_vars/oike.yml
---
ansible_host: 192.168.111.106
ansible_python_interpreter: /usr/libexec/platform-python
group_vars/all.yml
---
ansible_user: vagrant
ansible_password: vagrant
group_vars/web.yml
---
http_port: 8080

アドホックコマンドでインベントリーを使用するメリット

一般的なアドホックコマンドを実行する手順です。

  1. 対象ホストに SSH などでログイン
  2. アドホックコマンドを実行
  3. 対象ホストからログアウト

ホストの台数が増えてくると、かなりシンドイです。

インベントリーにアドホックコマンドの実行対象のホスト (管理対象ノード) を書くと、書いたホストに対して一度にアドホックコマンドが実行できます。

  1. ansible コマンドでアドホックコマンドを実行

対象ホストの台数に関係なく、1 回で実行できます。対象のホストが増えたらインベントリーファイルに追記するだけです。

ansible コマンド

Ansible のモジュールを使用してアドホックコマンドを実行します。

構文

ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
        [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
        [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE]
        [-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
        [-c CONNECTION] [-T TIMEOUT]
        [--ssh-common-args SSH_COMMON_ARGS]
        [--sftp-extra-args SFTP_EXTRA_ARGS]
        [--scp-extra-args SCP_EXTRA_ARGS]
        [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
        [-e EXTRA_VARS] [--vault-id VAULT_IDS]
        [--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES]
        [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
        [--task-timeout TASK_TIMEOUT] [-a MODULE_ARGS]
        [-m MODULE_NAME]
        pattern

主なパラメーター

パラメーター 説明
pattern 管理対象ノード名またはグループ名を指定する
-i インベントリーファイルを指定する
-m アドホックコマンドとして実行する Ansible のモジュール[1]を指定する
-a 実行するモジュールのパラメーターを指定する
-b 管理者モードで実行する

-m パラメーターの省略時は ansible.builtin.command モジュールを指定したものとして扱われます。

使用例

Linux コマンドを実行

すべての管理対象ノードのハードディスクの空き容量を確認する

すべての管理対象ノードで df -H コマンドを実行して、ハードディスクの空き容量を確認します。すべての管理対象ノードを指定するため pattern に "all" グループを指定します。Linux コマンドの実行は ansible.builtin.command モジュール、パラメーターは実行するコマンドです。

y_mrok@ctrl:~/code/exam3$ ansible all -i hosts.yml -m ansible.builtin.command -a "df -H"
oshikoji | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.1G     0  2.1G   0% /dev
tmpfs           414M  5.6M  409M   2% /run
/dev/sda1        22G  1.1G   19G   6% /
tmpfs           2.1G     0  2.1G   0% /dev/shm
tmpfs           5.3M     0  5.3M   0% /run/lock
tmpfs           2.1G     0  2.1G   0% /sys/fs/cgroup
tmpfs           414M     0  414M   0% /run/user/1000
ebisugawa | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.1G     0  2.1G   0% /dev
tmpfs           413M  951k  412M   1% /run
/dev/sda1        42G  1.4G   41G   4% /
tmpfs           2.1G     0  2.1G   0% /dev/shm
tmpfs           5.3M     0  5.3M   0% /run/lock
tmpfs           2.1G     0  2.1G   0% /sys/fs/cgroup
/dev/loop0       59M   59M     0 100% /snap/core18/2128
/dev/loop1       74M   74M     0 100% /snap/lxd/21029
/dev/loop2       34M   34M     0 100% /snap/snapd/12883
tmpfs           413M     0  413M   0% /run/user/1000
nijyo | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.1G     0  2.1G   0% /dev
tmpfs           414M  623k  414M   1% /run
/dev/sda1        42G  1.2G   41G   3% /
tmpfs           2.1G     0  2.1G   0% /dev/shm
tmpfs           5.3M     0  5.3M   0% /run/lock
tmpfs           2.1G     0  2.1G   0% /sys/fs/cgroup
vagrant         2.0T  716G  1.3T  36% /vagrant
tmpfs           414M     0  414M   0% /run/user/1000
takeyamachi | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           2.0G  9.0M  2.0G   1% /run
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1        43G  3.2G   40G   8% /
tmpfs           398M     0  398M   0% /run/user/1000
marutamachi | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.1G     0  2.1G   0% /dev
tmpfs           2.1G     0  2.1G   0% /dev/shm
tmpfs           2.1G   18M  2.1G   1% /run
tmpfs           2.1G     0  2.1G   0% /sys/fs/cgroup
/dev/sda1        11G  3.6G  7.2G  34% /
tmpfs           412M     0  412M   0% /run/user/1000
oike | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        2.1G     0  2.1G   0% /dev
tmpfs           2.1G     0  2.1G   0% /dev/shm
tmpfs           2.1G   18M  2.1G   1% /run
tmpfs           2.1G     0  2.1G   0% /sys/fs/cgroup
/dev/sda2        19G  1.8G   18G  10% /
vagrant         2.0T  716G  1.3T  36% /vagrant
tmpfs           413M     0  413M   0% /run/user/1000
y_mrok@ctrl:~/code/exam3$ 

ansible.builtin.command モジュールは省略できるので次のコマンドも結果は同じです。

ansible all -i hosts.yml -a "df -H"

"web" グループに含まれる管理対象ノードのカレントディレクトリーを確認する

pwd コマンドで管理対象ノードに接続したときのカレントディレクトリーを調べます。対象は "web" グループなので、 pattern に "web" グループを指定します。

y_mrok@ctrl:~/code/exam3$ ansible web -i hosts.yml -a "pwd"
ebisugawa | CHANGED | rc=0 >>
/home/vagrant
nijyo | CHANGED | rc=0 >>
/home/vagrant
takeyamachi | CHANGED | rc=0 >>
/home/vagrant
y_mrok@ctrl:~/code/exam3$ 

管理対象ノード nijyo にログインしているユーザーの識別情報を確認する

id コマンドで管理対象ノードにログインしているユーザーの識別情報を確認します。対象は管理対象ノード nijyo なので、 pattern に nijyo を指定します。

y_mrok@ctrl:~/code/exam3$ ansible nijyo -i hosts.yml -a "id"
nijyo | CHANGED | rc=0 >>
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
y_mrok@ctrl:~/code/exam3$ 

管理対象ノード oikke の「/etc/shadow」ファイルの内容を確認する

cat コマンドで管理対象ノードの 「/etc/shadow」ファイルの内容を確認します。

y_mrok@ctrl:~/code/exam3$ ansible oike -i hosts.yml -a "cat /etc/shadow"
oike | FAILED | rc=1 >>
cat: /etc/shadow: Permission deniednon-zero return code
y_mrok@ctrl:~/code/exam3$ 

"Permission denied (権限がない)" と怒られました。「/etc/shadow」ファイルの内容を確認するには管理者権限が必要です。この様な場合は -b オプションを指定して実行します。

y_mrok@ctrl:~/code/exam3$ ansible oike -i hosts.yml -a "cat /etc/shadow" -b
oike | CHANGED | rc=0 >>
root:$6$dFB9sCuHWw/byZzf$3cRlt724DoDr.8svhdC622OVjG8b8Lm8uEG1tp/0GF.d5rNv57TcW8jdKcM.Jhbq9krBrGzeChc3Ynu1GJqAW/::0:99999:7:::
bin:*:18505:0:99999:7:::
daemon:*:18505:0:99999:7:::
adm:*:18505:0:99999:7:::
lp:*:18505:0:99999:7:::
sync:*:18505:0:99999:7:::
shutdown:*:18505:0:99999:7:::
halt:*:18505:0:99999:7:::
mail:*:18505:0:99999:7:::
operator:*:18505:0:99999:7:::
games:*:18505:0:99999:7:::
ftp:*:18505:0:99999:7:::
nobody:*:18505:0:99999:7:::
dbus:!!:18832::::::
systemd-coredump:!!:18832::::::
systemd-resolve:!!:18832::::::
tss:!!:18832::::::
unbound:!!:18832::::::
polkitd:!!:18832::::::
sssd:!!:18832::::::
chrony:!!:18832::::::
sshd:!!:18832::::::
rngd:!!:18832::::::
vagrant:$6$LuZXBW8AOuBfSRSh$W/nBrs916R9wj1W0V8ar2pyNva3jtuzB3gDso5Yyx1w5dFSkMwYNlSUwMboWHWARd8Aq8tAKQTOB87iHrAtDW.::0:99999:7:::
vboxadd:!!:18832::::::
rpc:!!:18832:0:99999:7:::
rpcuser:!!:18832::::::
y_mrok@ctrl:~/code/exam3$ 

Ansible のモジュールを実行

管理対象ノードへファイルをコピーする

コントロールノードのカレントディレクトリー上の「abc.txt」ファイルを管理対象ノード ebisugawa にコピーします。
コピーするファイルを確認します。

y_mrok@ctrl:~/code/exam3$ ls -l abc.txt
-rw-rw-r-- 1 y_mrok y_mrok 31  8月 28 16:03 abc.txt
y_mrok@ctrl:~/code/exam3$ 

コピー前の ebisugawa のディレクトリーの状況です。

y_mrok@ctrl:~/code/exam3$ ansible ebisugawa -i hosts.yml -a "ls -l"
ebisugawa | CHANGED | rc=0 >>
total 0
y_mrok@ctrl:~/code/exam3$ 

ansible.builtin.copy モジュールを使用してファイルをコピーします。-a パラメーター内の src がコントロールノードのコピー元の、dest が管理対象ノードのコピー先の path を指定します。

y_mrok@ctrl:~/code/exam3$ ansible ebisugawa -i hosts.yml -m ansible.builtin.copy -a "src='./abc.txt' dest='~/'"
ebisugawa | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "checksum": "fa0de21618e8ac69506384fa222dde9a57e54c42",
    "dest": "/home/vagrant/abc.txt",
    "gid": 1000,
    "group": "vagrant",
    "md5sum": "60199a5e05b3d7a03ed4cc6fd2eabacd",
    "mode": "0664",
    "owner": "vagrant",
    "size": 31,
    "src": "/home/vagrant/.ansible/tmp/ansible-tmp-1630135020.258051-3908-206476717235531/source",
    "state": "file",
    "uid": 1000
}
y_mrok@ctrl:~/code/exam3$ 

コピー後の ebisugawa のディレクトリーの状況です。コピーしたファイルを確認できます。

y_mrok@ctrl:~/code/exam3$ ansible ebisugawa -i hosts.yml -a "ls -l"
ebisugawa | CHANGED | rc=0 >>
total 4
-rw-rw-r-- 1 vagrant vagrant 31 Aug 28 16:17 abc.txt
y_mrok@ctrl:~/code/exam3$ 

今回は管理対象ノードを指定しました。グループを指定するとグループに含まれる管理対象ノードすべてに対し同時にファイルをコピーできます。

演習問題

演習問題はこのリンクをクリックしてください。

脚注
  1. Index of all Modules (https://docs.ansible.com/ansible/latest/collections/index_module.html) ↩︎