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番目のデバッグアクション用)?
回避策として、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
デバッグモジュールは配列をサポートしているので、次のようにすることができます:
debug:
msg:
- "First line"
- "Second line"
出力:
ok: [node1] => {
"msg": [
"First line",
"Second line"
]
}
または、次の回答の方法を使用できます。
デバッグで複数行のテキストを印刷するのに最も便利な方法は次のとおりです。
- 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 に感謝します。
[:-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..."
]
私はsedを介してパイプ出力について@Bruce Pの答えを少し掘り下げましたが、これが私が思いついたことです:
ansible-playbook [blablabla] | sed 's/\\n/\n/g'
誰かが興味があるなら。
これは ここで説明 です。つまり、出力をsedにパイプして\n
を実際の改行に変換するか、コールバックプラグインを作成してこれを行う必要があります。
レジスタ変数のstdout_lines
を使用できます。
- name: Do something
Shell: "ps aux"
register: result
- debug: var=result.stdout_lines
フォーマット(例:改行、タブなど)付きのメッセージを表示するために見つけた最も便利で簡単な方法は、 "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
=========================
-
複数のホストがある場合、「一時停止」タスクはホストのリストの最初のホストに対して一度だけ実行されることに注意してください。
つまり、表示する変数がホストの一部にのみ存在し、最初のホストにその変数が含まれていない場合、エラーが発生します。
このような問題を回避するには、{{my_var}}の代わりに{{hostvars ['my_Host'] ['my_var']}}を使用します
「一時停止」と「いつ」条件を組み合わせると、タスクがスキップされる可能性があります!、なぜですか?タスクは、指定された「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 %}
コンソールに出力したいログファイルにも同様の問題がありました。 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 }}"
しかし、私の場合は必要ありませんでした