web-dev-qa-db-ja.com

Ansible-メッセージを出力-デバッグ:msg = "line1 \ n {{var2}} \ n line3 with var3 = {{var3}}"

Ansible(1.9.4)または2.0.0で

次のアクションを実行しました。

- debug: msg="line1 \n {{ var2 }} \n line3 with var3 = {{ var3 }}"

$ cat roles/setup_jenkins_slave/tasks/main.yml

- debug: msg="Installing swarm slave = {{ slave_name }} at {{ slaves_dir }}/{{ slave_name }}"
  tags:
    - koba

- debug: msg="1 == Slave properties = fsroot[ {{ slave_fsroot }} ], master[ {{ slave_master }} ], connectingToMasterAs[ {{ slave_user }} ], description[ {{ slave_desc }} ], No.Of.Executors[ {{ slave_execs }} ], LABELs[ {{ slave_labels }} ], mode[ {{ slave_mode }} ]"
  tags:
    - koba


- debug: msg="print(2 == Slave properties = \n\nfsroot[ {{ slave_fsroot }} ],\n master[ {{ slave_master }} ],\n connectingToMasterAs[ {{ slave_user }} ],\n description[ {{ slave_desc }} ],\n No.Of.Executors[ {{ slave_execs }} ],\n LABELs[ {{ slave_labels }} ],\n mode[ {{ slave_mode }} ])"
  tags:
    - koba

しかし、これは新しい行で変数を印刷していません(3番目のデバッグアクション用)?

42
Arun Sangal

回避策として、with_itemsを使用しましたが、それは私にとってはうまくいきました。

- debug: msg="Installing swarm slave = {{ slave_name }} at {{ slaves_dir }}/{{ slave_name }}"

- debug: msg="Slave properties = {{ item.prop }} [ {{ item.value }} ]"
  with_items:
   - { prop: 'fsroot', value: "{{ slave_fsroot }}" }
   - { prop: 'master', value: "{{ slave_master }}" }
   - { prop: 'connectingToMasterAs', value: "{{ slave_user }}" }
   - { prop: 'description', value: "{{ slave_desc }}"  }
   - { prop: 'No.Of.Executors', value: "{{ slave_execs }}" }
   - { prop: 'LABELs', value: "{{ slave_labels }}" }
   - { prop: 'mode', value: "{{ slave_mode }}" }
  tags:
    - koba
0
Arun Sangal

デバッグモジュールは配列をサポートしているので、次のようにすることができます:

debug:
  msg:
    - "First line"
    - "Second line"

出力:

ok: [node1] => {
    "msg": [
        "First line",
        "Second line"
    ]
}

または、次の回答の方法を使用できます。

YAMLでは、文字列を複数の行に分割するにはどうすればよいですか?

53
diabloneo

デバッグで複数行のテキストを印刷するのに最も便利な方法は次のとおりです。

- name: Print several lines of text
  vars:
    msg: |
         This is the first line.
         This is the second line with a variable like {{ inventory_hostname }}.
         And here could be more...
  debug:
    msg: "{{ msg.split('\n') }}"

メッセージを配列に分割し、各行を文字列としてデバッグ出力します。出力は次のとおりです。

ok: [example.com] => {
    "msg": [
        "This is the first line.", 
        "This is the second line with a variable like example.com", 
        "And here could be more...", 
        ""
    ]
}

jhutar に感謝します。

45
maikel

[:-1]aptの最後の空の文字列を抑制する

---
- name: 'apt: update & upgrade'
  apt:
    update_cache: yes
    cache_valid_time: 3600
    upgrade: safe
  register: apt
- debug: msg={{ apt.stdout.split('\n')[:-1] }}

上記のdebug:行は、.split('\n')によるNice改行と、[:-1]による最後の空の文字列の抑制をもたらします。もちろん、それらはすべてPython文字列操作です。

"msg": [
    "Reading package lists...", 
    "Building dependency tree...", 
    "Reading state information...", 
    "Reading extended state information...", 
    "Initializing package states...", 
    "Building tag database...", 
    "No packages will be installed, upgraded, or removed.", 
    "0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.", 
    "Need to get 0 B of archives. After unpacking 0 B will be used.", 
    "Reading package lists...", 
    "Building dependency tree...", 
    "Reading state information...", 
    "Reading extended state information...", 
    "Initializing package states...", 
    "Building tag database..."
]
4

私はsedを介してパイプ出力について@Bruce Pの答えを少し掘り下げましたが、これが私が思いついたことです:

ansible-playbook [blablabla] | sed 's/\\n/\n/g'

誰かが興味があるなら。

2
edelans

これは ここで説明 です。つまり、出力をsedにパイプして\nを実際の改行に変換するか、コールバックプラグインを作成してこれを行う必要があります。

1
Bruce P

レジスタ変数のstdout_linesを使用できます。

- name: Do something
  Shell: "ps aux"
  register: result

- debug: var=result.stdout_lines
0
Eugene Lopatkin

一時停止モジュール:

フォーマット(例:改行、タブなど)付きのメッセージを表示するために見つけた最も便利で簡単な方法は、 "debug"モジュールの代わりに " pause "モジュールを使用することです:

    - pause:
        seconds: 1
        Prompt: |
          ======================
            line_1
            line_2
          ======================

プロンプト内に書式設定(改行、タブ...)を含む変数を含めることもでき、期待どおりに表示されます。

- name: test
  hosts: all
  vars:
    line3: "\n  line_3"
  tasks:
    - pause:
        seconds: 1
        Prompt: |
          /////////////////
            line_1
            line_2 {{ line3 }}
          /////////////////

-

ヒント:

コマンドからの出力を表示し、コマンドを実行して出力を登録するために追加のタスクを実行する代わりに、プロンプト内でパイプルックアップを直接使用して、ワンショットでジョブを実行できます。

    - pause:
        seconds: 1
        Prompt: |
          =========================
            line_1
            {{ lookup('pipe', 'echo "line_2 with \t tab \n  line_3 "') }}
            line_4
          =========================

-

一時停止モジュールに関する追加のメモ:

  1. 複数のホストがある場合、「一時停止」タスクはホストのリストの最初のホストに対して一度だけ実行されることに注意してください。

    つまり、表示する変数がホストの一部にのみ存在し、最初のホストにその変数が含まれていない場合、エラーが発生します。

    このような問題を回避するには、{{my_var}}の代わりに{{hostvars ['my_Host'] ['my_var']}}を使用します

  2. 「一時停止」と「いつ」条件を組み合わせると、タスクがスキップされる可能性があります!、なぜですか?タスクは、指定された「when」条件に適合しない可能性がある最初のホストに対して1回だけ実行されるためです。

    これを回避するには、ホストの数を制限する条件を使用しないでください!あなたもそれを必要としないので、タスクがとにかく一度だけ実行されることを知っているので、ピックアップされたホストが何であれ、必要な変数を取得するために上記のhostvarsも使用してください。

例:

間違った:

- name: test
  hosts: Host1,Host2
  vars:
    display_my_var: true
  tasks:
    - when: inventory_hostname == 'Host2'
      set_fact:
        my_var: "hi there"
    - when:
      - display_my_var|bool
      - inventory_hostname == 'Host2'
      pause:
        seconds: 1
        Prompt: |
          {{ my_var }}

この例では、最初のホスト「Host1」のみを選択し、条件の評価を開始するため、一時停止タスクがスキップされます。

正しい:

- name: test
  hosts: Host1,Host2
  vars:
    display_my_var: true
  tasks:
    - when: inventory_hostname == 'Host2'
      set_fact:
        my_var: "hi there"
    - when: display_my_var|bool
      pause:
        seconds: 1
        Prompt: |
          {{ hostvars['Host2']['my_var'] }}

コンテンツがホストに依存するメッセージを表示する別の例:

    - set_fact:
        my_var: "hi from {{ inventory_hostname }}"
    - pause:
        seconds: 1
        Prompt: |
          {% for Host in ansible_play_hosts %}
            {{ hostvars[Host]['my_var'] }}
          {% endfor %}
0
Ejez

コンソールに出力したいログファイルにも同様の問題がありました。 split("\n")は正常に動作しますが、表示される\nを各行に追加するため、より良い方法が見つかりました

  tasks:
- name: Read recent lines from logfile for service {{ appName }}
  Shell: tail -n 1000 {{ logFile }}
  register: appNameLogFile

- debug:
    msg: "This is a stdout lines"
  with_items: "{{ appNameLogFile.stdout }}"

appNameLogFileの各行を反復処理し、副作用としてこの行をコンソールに出力します。に更新できます

        msg: "This is a stdout lines: {{ item }}"

しかし、私の場合は必要ありませんでした

0
Damian