[Linux32-6]詳細なプレイブック構文(2)



[Linux32-4]詳細なプレイブック(1)



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つのステップに分かれています。

  1. タグは、個別に、またはブロック、ロール、ロール、またはインポートされたタグからの継承を通じてタスクに追加できます。
  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タグの実行またはスキップの選択


実行オプション
-タグ
指定実行
-スキップタグ
飛び越える

Ansible組み込みタグ
すべて
すべて(デフォルト)
常に
常に実行する
決して
絶対に実行しない
タグ付き
ラベル付き
タグなし
ラベルなし

--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

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

おすすめ

転載: blog.csdn.net/weixin_46069582/article/details/112304051