記事ディレクトリ
1. Ansibleアーティファクトの再利用(役割とタスクのインポート)
スクリプトの再利用:静的インポート
- import_playbook: playbook.yml
ファイルと役割を再利用します。
静的インポート:Ansibleは、プレイブック内のタスクを実行する前に前処理するため、インポートされたコンテンツがトップレベルのプレイブック内の他のタスクの影響を受けることはありません。
静态:
- import_tasks: 任务文件.yml
- import_role: 角色
動的インポート:Ansibleプロセスにはスクリプト内のファイルと役割が含まれているため、含まれているタスクは、最上位スクリプト内の以前のタスクの結果の影響を受ける可能性があります。含まれているロールとタスクはハンドラーに似ています。トップレベルのスクリプトの他のタスクの結果に応じて、実行される場合と実行されない場合があります。
动态:
- include_tasks: 任务文件.yml
- include_role: 角色
- include_vars: {
{
变量名 }}
2.ループループ(with_ *)
- 定義:ループ
- 引用:{ {アイテム}}
2.1リストをトラバースする
#playbook
---
- hosts: test
gather_facts: no
vars_files:
- userlist.yml
tasks:
- name: create users
user:
name: "{
{ item.user }}"
password: "{
{ item.passwd | password_hash('sha512') }}"
loop: "{
{ userlist }}"
#userlist.yml
---
userlist:
- user: 'user1'
passwd: '123'
- user: 'user2'
passwd: '456'
- user: 'user3'
passwd: '789'
2.2ハッシュテーブルをトラバースする
示例1:
---
- hosts: test
tasks:
- name: create users
user:
name: "{
{ item.user }}"
password: "{
{ item.passwd | password_hash('sha512') }}"
loop:
- {
user: 'user1', passwd: '123' }
- {
user: 'user2', passwd: '124' }
- {
user: 'user3', passwd: '125' }
2.3辞書を繰り返す
辞書をトラバースするには、
dict2items
- name: Using dict2items
ansible.builtin.debug:
msg: "{
{ item.key }} - {
{ item.value }}"
loop: "{
{ tag_data | dict2items }}"
vars:
tag_data:
Environment: dev
Application: payment
#遍历tag_data并从中打印键和值
2.4変数をループに登録する
- name: Register loop output as a variable
ansible.builtin.shell: "echo {
{ item }}"
loop:
- "one"
- "two"
register: echo
对注册变量进行的循环检查结果:
loop: "{
{ echo.results }}"
结果将放置在变量中 echo.stdout
2.5ループ出力関数のクエリとルックアップ
loop: "{
{ query('inventory_hostnames', 'all') }}"
loop: "{
{ lookup('inventory_hostnames', 'all', wantlist=True) }}"
3.いつ
3.1基本条件
[注:比類のない中括弧]
示例:
---
- hosts: all
tasks:
- name: install apache
dnf:
name: httpd
state: present
when: ansible_hostname == "server2"
when: ansible_facts['XXX']['XXX']['XXX'] == XXX
3.2ループで条件を使用する
tasks:
- name: Run with items greater than 5
ansible.builtin.command: echo {
{
item }}
loop: [ 0, 2, 4, 6, 8, 10 ]
when: item > 5
若是字典:
when: item.value > 5
4.ブロックブロック処理
タスクのグループ化
tasks:
- name: ...
block:
- name: ...
- name: ...
4.1レスキュー処理エラー
タスクが「失敗」ステータスに戻った後にのみレスキューを実行します
示例:
---
- hosts: ...
tasks:
- name:
block:
- name: ...
dnf:
name: httpd
state: present
rescue:
- name: ...
4.2常にエラーを処理する
前のブロックのタスクステータスに関係なく、のタスクは常に実行されます
示例:
---
- hosts: localhost
tasks:
- name: Handle the error
block:
- debug:
msg: 'I execute normally'
- name: i force a failure
command: /bin/false
rescue:
- debug:
msg: 'I caught an error, can do stuff here to fix it, :-)'
always:
- debug:
msg: "This always executes, :-)"
5.スクリプトでのエラー処理
Ansibleがコマンドからゼロ以外の戻りコードを受信するか、モジュールに障害が発生すると、デフォルトでは、このホストでの実行が停止し、他のホストでの実行が続行されます。ただし、場合によっては、別の動作が必要になることがあります。ゼロ以外の戻りコードが成功を示す場合があります。1つのホストで失敗して、すべてのホストでの実行を停止したい場合があります
失敗したコマンドを無視する
- デフォルトでは、タスクがホストで失敗すると、Ansibleはホストでのタスクの実行を停止します
ignore_errors: yes
:タスクを実行でき、戻り値が「失敗」した場合にのみ機能します
到達不能なホストエラーを無視する
ignore_unreachable: yes
:Ansibleはタスクエラーを無視しますが、到達不能なホストに対して今後のタスクを実行し続けません
到達不能なホストをリセットする
- 問題:Ansibleがホストに接続できない場合、Ansibleはそのホストを「到達不能」としてマークし、実行中のアクティブなホストのリストから削除します。
meta:clear_host_errors
:すべてのホストを再アクティブ化します。フォローアップタスクはそれらに再度アクセスを試みることができます
「変更された」を定義する
changed_when: XXX
:特定のタスクがリモートノードを「変更」したとき
最大障害率を設定します。max_fail_percentage: 30
- ローリングアップデートを実行する場合など、特定の障害しきい値に達したときに再生を停止したい場合があります。
示例:
---
- hosts: webservers
max_fail_percentage: 30
serial: 10
max_fail_percentage
ときserial
に使用され、この設定は各バッチに適用されます。上記の例では、サーバーの最初のバッチ(または任意のバッチ)の10台のサーバーのうち3つ以上に障害が発生すると、残りのゲームは中止されます
ブロックを使用してエラーを処理する:この記事の第4章を参照してください
6.タグ
タグを使用して選択したタスクを実行またはスキップするプロセスは、次の2つのステップに分かれています。
- タグは、個別に、またはブロック、ロール、ロール、またはインポートされたタグからの継承を通じてタスクに追加できます。
- スクリプトの実行時にタグを選択またはスキップする
6.1タグを追加する
- 単一のタスクにタグを追加します。
- 多対1:1つのタスクに適用される1つ以上のラベル
- 1対多:同じラベルが複数のタスクに適用されます
---
- hosts: test
tasks:
- name: ...
dnf:
name: ...
tags:
- packages
- webservers
- import_に追加
---
- hosts: webservers
tasks:
- name: ...
import_role:
name: ...
tags:
- bar
- baz
- name: ...
import_tasks: ...yml
tags: [ web, foo ]
- タグの継承:複数のタスクにタグを追加します
向block添加标签:
tasks:
- block: ...
tags: Apache
- name: ...
- name: ...
- name: ...
tags: 标签
向每一个play中添加:
- hosts: all
tags: 标签1
tasks: ...
- host: test
tags: 标签2
tasks: ...
向角色添加标签:
roles:
- role: ...
tags: [ web, foo ]
或
---
- hosts: ...
roles:
- role: ...
tags:
- 标签
- 标签
6.2特別なタグは常にそして決して
常に:常にタスクを実行するか再生します(特に--skip-tagsを常にスキップしない限り)
決して:タスクをスキップするか、再生します(--tagsが実行されない場合を除く)
---
- hosts: ...
tasks:
- name: ...
tags:
- always
- name: ...
tags:
- never
6.3タグの実行またはスキップの選択
|
|
---|---|
|
指定実行 |
|
飛び越える |
|
|
---|---|
|
すべて(デフォルト) |
|
常に実行する |
|
絶対に実行しない |
|
ラベル付き |
|
ラベルなし |
--tags all
:すべてのタスクを実行し、タグを無視します(デフォルトの動作)
--tags [tag1, tag2]
:タグtag1およびtag2でのみ実行
--skip-tags [tag3, tag4]
:タグtag3とtag4を除くすべてのタスクを実行します
--tags tagged
:少なくとも1つのラベルが付いたタスクのみを実行する
--tags untagged
:タグなしでタスクを実行するだけ
6.4 [プレビュー]タブ
--list-tags
:使用可能なタグのリストを生成します
--tags tagname --list-tags
:タグ付きタスクを生成する
--skip-tags tagname --list-tags
:タグなしでタスクを生成する
7.インタラクティブな入力および出力プロンプト
ユーザーに変数の入力を求めることで、パスワードなどの機密データの記録を回避できます。セキュリティに加えて、プロンプトは柔軟性もサポートします
キーワード:vars_prompt
|
|
---|---|
|
出力の内容を定義します |
|
プライベート:ユーザー入力は表示されません |
プライベート:はいユーザー入力を非表示(デフォルト) | |
|
デフォルト値を設定します。値が入力されていない場合は、デフォルト値を使用します |
|
再度確認してください(パスワードの使用に適しています) |
|
特殊文字を受け入れる |
示例:
---
- hosts: localhost
vars_prompt:
- name: username
prompt: What is your username?
private: no
- name: password
prompt: What is your password?
tasks:
- name: 测试Apache,返回直
uri:
url: http://192.168.43.27
user: "{
{ username }}"
password: "{
{ password }}"
return_content: yes
status_code: 200
register: result
- debug:
var: result
加密示例:
vars_prompt:
- name: my_password2
prompt: Enter password2
private: yes
encrypt: sha512_crypt
confirm: yes
salt_size: 7