web-dev-qa-db-ja.com

Ansibleタスクはローカルログファイルに書き込みます

Ansibleを使用して、コマンドを実行するタスクのsysoutをローカル(つまり、管理対象サーバー上)のログファイルに書き込むことができるようにしたいと考えています。今のところ、私はこのようなタスクを使用してのみこれを行うことができます:

- name: Run my command
  Shell: <command> <arg1> <arg3> ... |tee -a <local log file>

これを行う理由は、が完了するまでに長い時間がかかり(つまり、出力の取得が完了するまで待つことができず)、実行中に出力を収集したいためです。

teeパイプを使用せずに実行中にコマンドのsysoutをローカルログファイルにリダイレクトする「Ansible」方法はありますか?

3
trikelef

最初のタスクで登録を使用する必要があります。次に、出力をローカルファイルに書き込むための2番目のタスクを作成できます。

- name: Shell command
  Shell: my_Shell_command
  register: myshell_output
- name: copy the output to a local file
  copy:
    content: "{{ myshell_output.stdout }}"
    dest: "/tmp/hello.txt"
  delegate_to: localhost
4
c4f4t0r

Ansibleのデフォルトで、最も一般的なパターンは、タスクを完了させ、最後に出力を登録することです。非同期機能がありますが、プレイブックで作成するジョブをクエリする必要があります。


むしろ、それを背景にするためにinitスクリプト機能を使用することを検討してください。あなたはこのLinuxにタグを付けました。このような堅牢なロギングは、systemdユニットでは非常に簡単です。

vmstatは定期的にデータをstdoutに出力し、簡単な例を示します。 vmstatの出力をログに記録する最も簡単な方法を紹介します。/etc/systemd/system/dumbstat.service

[Unit]
Description=Dumb vmstat wrapper service example
Documentation=https://serverfault.com/questions/958952/ansible-task-write-to-local-log-file

[Service]
Type=oneshot
ExecStart=/usr/bin/vmstat 5 12
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Type=oneshotは、プロセスが終了するまで開始状態で待機します。非同期フォークを増やして動作を続行したい場合は、別のタイプが必要になる場合があります。

標準出力がキャプチャされ、通常のツールを介して利用できます。

root@sf-958952:/var/log# systemctl status dumbstat
● dumbstat.service - Dumb vmstat wrapper service example
   Loaded: loaded (/etc/systemd/system/dumbstat.service; disabled; vendor preset: enabled)
   Active: activating (start) since Wed 2019-03-20 14:49:41 UTC; 7s ago
     Docs: https://serverfault.com/questions/958952/ansible-task-write-to-local-log-file
 Main PID: 3103 (vmstat)
    Tasks: 1 (limit: 4401)
   CGroup: /system.slice/dumbstat.service
           └─3103 /usr/bin/vmstat -w 5 12

Mar 20 14:49:41 sf-958952 systemd[1]: Starting Dumb vmstat wrapper service example...
Mar 20 14:49:41 sf-958952 vmstat[3103]: procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
Mar 20 14:49:41 sf-958952 vmstat[3103]:  r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
Mar 20 14:49:41 sf-958952 vmstat[3103]:  7  0            0      3104416        70260       417228    0    0   208    36   40  132   1   1  98   0   0
Mar 20 14:49:46 sf-958952 vmstat[3103]:  0  0            0      3107200        70260       417260    0    0     0     0   40  130   1   0  99   0   0

Systemdジャーナルをクエリして出力をフィルタリングすることもできます:journalctl _SYSTEMD_UNIT=dumbstat.service

ローカルファイルが必要な場合、またはジャーナルをどこかに転送する場合、デフォルトでジャーナルはsyslogに転送されます。

面白いことに、システム240以降はStandardOutput=append:を含むファイルに直接ログを記録できますが、これはCentOS 7またはUbuntu 18.04にはあまりにも新しいものです。


これらすべては、Ansibleとはほとんど関係ありません。そのようなユニットをtemplateモジュールでデプロイし、systemdモジュールで開始できます。

1
John Mahowald