Help us understand the problem. What is going on with this article?

Tips: Ansibleでwhen:にlookup('pipe','ssh ..')を使用して、事前タスクでの情報収拾を省略

問題:

Ansibleでターゲットノード上の状況により処理の実行可否を決める際、一般には別タスクでの事前情報収拾が必要

例えば以下の様に情報収集タスクと実行タスクの2タスク必要。

tasks
-
  name: ターゲットノードで/tmp/abc.txtに"ABC"という文字列が含まれるならば
  shell: grep "ABC" /tmp/abc.txt
  register: r

-
  name: 何らかの処理を行う
  when: r.rc == 0
  shell: rm /tmp/abc.txt

ソリューション:

when:にlookup('pipe','ssh ..')を使用して情報を入手させる対応が可能

例えば以下の様に書ける。

tasks
-
  name: ターゲットノードで/tmp/abc.txtに"ABC"という文字列が含まれるならば何らかの処理を行う
  when: >-
    lookup('pipe','
    ssh
    -l '+ansible_env.SUDO_USER+'
    -p '+ansible_ssh_port|string+'
    -i '+ansible_ssh_private_key_file+'
    -o StrictHostKeyChecking=no '+
    ansible_ssh_host+'
    grep -q "ABC" /tmp/abc.txt;
    echo $?
    ') == '0'
  shell: rm /tmp/abc.txt

書けないことは無いが、、、可読性は悪いですね。。。。
sudoなどは必要に応じて追加。
この例ではstdoutを使っているのでgrepの-qオプションなどを省くと問題が生じる。

hiroyuki_onodera
インフラエンジニア。 Ansible, Chef等による自動化、クラスターSW(PowerHA,TSA, pacemaker)などをしています。 このサイトにおける掲載内容はあくまで私自身の見解であり、必ずしも私の所属団体・企業における立場、戦略、意見を代表するものではありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away