タスク実行、オーケストレーションとスコープのチェックと制御


Ansibleは、あなたのインフラストラクチャを偉大な制御を与える強力なツールです.私が自宅で私の基盤をインストールして、維持する可用性のあるコードを開発したとき、私は最初にほとんどのスクリプトを最初のファイルとして書きました.これはいくつかの時間に適していました-あなたが構造が複雑になっていることに気づくまで、あなたはかなりの時間のためにあなたが必要とするスクリプトを探しているとわかります.それから私は適切なレイアウトにコードベースをリファクタリングしましたsite.yml それはすべての演劇や役割が含まれます.しかし、私は特定のノードの特定の仕事だけを走らせる方法に苦労していました.
この記事では、どのタスクを実行するか、どのホストをターゲットにしてもタスクのカスタムオーケストレーションを制御するために、ansibleコマンドラインを使用する方法を示します.あなたが不可解な概念の上でRefresherを必要とするならば、脚注を読んでください1 .
この記事はもとでmy blog .

ホームプロジェクトの私の基盤のディレクトリレイアウト
実行中の例として、ホームプロジェクトのホームレイアウトからファイルのレイアウトとファイルを表示します.
一番上のレベルでは、以下のディレクトリとファイルがあります.
├── group_vars
├── host_vars
├── roles
├── scripts
├── site.yml
The roles 各ノードにインストールされる基本的なソフトウェアを定義します.
├── roles
│   ├── consul
│   └── nomad
│   └── dns
│   ├── docker-arch
│   ├── docker-arm
│   ├── nfs-client
│   ├── nfs-server
├── site.yml
And scripts ノードの選択された数で実行する小さなタスクを含みます.例えば、ノードのnomadジョブやシステムメンテナンスタスクを展開します.
├── scripts
│   ├── consul
│   ├── nomad
│   ├── tutorial
│   └── uninstall
│   ├── system
│   │   ├── clean_docker.yml
│   │   ├── connection_test.yml
│   │   ├── install_package_on_arch.yml
│   │   ├── install_package_on_debian.yml
│   │   ├── reboot.yml
│   │   ├── rotate_ssh_key.yaml
│   │   ├── shutdown.yml
│   │   └── update_packages.yml
すべてのロールといくつかのスクリプトが定義されますsite.yml . これは、Docker、NOMAD、consul、DNSとNFSサービスを持つすべてのノードを設定するiDemanceプレイブックです.
では、どのようにしてタスクの小さなセットを実行できますかsite.yml PlayBook、完全にそれを実行せずに?…を読む.

実行前にチェックブック
タスクの長いリストを実行する前に、それはあなたの脚本が動作し、それが起こるかどうかを確認する良いアイデアです.スクリプトを実行する前に、私が強く推奨する4種類のチェックがあります.

構文チェック
まず、フラグで構文をチェックしてください--check-syntax 脚本を実行するときに使われるすべてのスクリプトならば.
>> ansible-playbook site.yml --syntax-check

OK playbook: site.yml
何らかのエラーが発生した場合は、例えば、役割については、有用な情報を取得します.
>> ansible-playbook site.yml --syntax-check
ERROR! Syntax Error while loading YAML.
  mapping values are not allowed in this context

The error appears to be in '[...]/roles/dns/tasks/main.yml': line 7, column 15, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  - name: Configure dnsmasq
      template:
              ^ here

リストホスト
第二に、影響を受けるホストを見てください.
>> ansible-playbook site.yml --list-hosts

playbook: site.yml

  play #1 (all): Install consul TAGS: [consul]
    pattern: ['all']
    hosts (6):
      raspi-3-1
      raspi-0
      raspi-4-1
      minas
      raspi-4-2
      raspi-3-2

リストのすべてのタスク
第三に、フラグで実行されるタスクに詳細な外観を取る--list-tasks .
>> ansible-playbook site.yml --list-tasks

playbook: site.yml

  play #1 (all): Install consul TAGS: [consul]
    tasks:
      command   TAGS: [consul]
      consul : Check if current consul version is installed     TAGS: [consul]
      consul : Set vars when architecture is armv7l     TAGS: [consul]
      consul : Set vars when architecture is armv6l     TAGS: [consul]
      consul : Set vars when architecture is x86_64     TAGS: [consul]
      consul : Create consul group      TAGS: [consul]
      consul : Create consul user       TAGS: [consul]
      consul : Create consul dir        TAGS: [consul]
      consul : Get consul binary        TAGS: [consul]
      consul : Unzip consul binary      TAGS: [consul]
      consul : Create symlink           TAGS: [consul]

すべての変更を詳細に実行する
最後に、ドライランを行うことができますし、各ステップの各結果を参照してノードに適用される--check --diff . このチェックは特に重要です!重要なシステムファイルを変更するたびに、それを実行します.例えば、新しい行を/etc/fstab ファイル.
>> ansible-playbook site.yml --check --diff


TASK [nfs-server : Install software] ****************************************
The following NEW packages will be installed:
  nfs-kernel-server
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
changed: [minas]

TASK [nfs-server : Create mount dir] ****************************************
--- before
+++ after
@@ -1,4 +1,4 @@
 {
     "path": "/mnt/nfs",
-    "state": "absent"
+    "state": "directory"
 }

changed: [minas]

TASK [nfs-server : Create fstab entry] ****************************************
--- before: /etc/fstab (content)
+++ after: /etc/fstab (content)
@@ -8,3 +8,4 @@
 UUID=BB43-B9B6                            /boot/efi      vfat    defaults,noatime 0 2
 UUID=1ece07a6-5072-4f25-aed0-27e01b0ded17 /              ext4    defaults,noatime 0 1
 192.168.2.203:/mnt/nfs  /mnt/nfs nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0
+/dev/sda1 /mnt/nfs ext3 defaults,user 0 1

changed: [minas]

TASK [nfs-server : Configure nfs access] ****************************************
--- before: /etc/exports (content)
+++ after: /etc/exports (content)
@@ -0,0 +1 @@
+/mnt/nfs 192.168.2.0/24(rw,sync,no_subtree_check,no_root_squash)

changed: [minas]
OK!この時点で、あなたの脚本が変更されるものの良い理解を持っています.レッツ続く.

タスク実行の制御
一度、タスクが正確に何をすべきかを確認し、正しいホストをターゲットにして実行します.例えば、私の中にsite.yml , 私はすべてのノードでDNS解決を構成するためにプレーをします.
- name: Configure DNS
  hosts:
    - all
  tags:
    - dns
  become: true
  roles:
    - dns
ただし、この演奏はファイルの途中に置かれる.どのように、私はちょうどこの特定の遊びを実行することができますか?

特定演劇の実施
最良のオプションは、タグを適用し、使用することです.タグは、あなたがロール内のロールやタスクに適用される任意の、よくタグです.上に示したように、私は「タグへのタグ」宣言を使います.特定のタグで再生を実行するには--tags フラグ.このフラグにタグのリストを1つまたは渡すことができます.
今、私はDNSプレイを実行したいだけならansible-playbook site.yml --tags consul . もう一つのオプションは、その名前を使用することですansible-playbook site.yml --start-at-task="Install consul" , しかし、タグが好ましい.

プレイの中で特定のタスクを実行する
あなたがスタートしたいプレイがいくつかのサブタスクを持っている場合、それらをすべて実行する必要はありませんか?ちょうど旗を加える--step . 任意のタスクが実行される前に、プロンプトが開かれ、続行する場合はお問い合わせします.質問に答えたり、いつでも脚本の実行を停止してctrl-c .
ansible-playbook -i hosts site.yml --tags "dns" --step

PLAY [Install consul]
****************************************


PLAY [Install nomad]
****************************************


PLAY [Configure DNS]
****************************************

Perform task: TASK: dns : Install dnsmasq on raspi-3-1 (N)o/(y)es/(c)ontinue:

特定のホストだけでタスクを実行する
テストをライブしたい場合は、完全なインベントリに変更する前に、1つのホストを変更するだけで便利です.役に立つ--limit あなたが何を使用する必要があります.
>> ansible-playbook -i hosts site.yml --tags "dns" --limit minas

TASK [dns : Install dnsmasq]
****************************************

ok: [minas]

TASK [dns : Configure dnsmasq]
ok: [minas]
今、あなたは中央の脚本からタスクのセットを選ぶことについてのすべてを学んだ.残っていることは一つだけです.

タスクの編成
あなたが脚本を実行するとき、各々の遊びで、すべての役割は最初に実行されます.場合は、別の方法でそれらを調整するには、タグもあなたを助けることができます.任意のタスクと任意の役割に複数のタグを適用することができます.例えば、ソフトウェアをインストールするすべてのタスクはinstall , そして、設定ファイルをコピーするすべてのタスクをタグ付けすることができますconfig . 次に、これらのタグを使用して脚本を実行します.ansible-playbook site.yml --tags "install, config" .

結論
この記事では、より複雑に複雑なプレイブックをどのように効果的に動作するかを示しました.まず、実行前にプレイブックをチェックする方法.構文チェック、どのようにタスクと影響を受けたホストのリストを見るか、どのようにドライランを行うかを学ぶ方法を学びました.ドライランは特に重要なシステム構成ファイルに影響するときに重要です.健康的な習慣を適用する--check しばしば旗.第二に、どのように実行中の特定の再生とタスクの再生を学んだ.タグはあなたに大きな柔軟性を与える.同様に、タスクとロールとして、あなたの脚本の中に名前を付けて適用します.そして、上記の1つのレベルを考えて、設定ファイルを変更するタスク、ソフトウェアをインストールするタスクを識別し、グループ化されたタグを与えます.一度タグを持つと、特にそれらを実行できます.また、これを組み合わせて--step 実行されるタスクについてプロンプトを表示するフラグ.そして、あなたが一貫してタグを定義するとき、あなたは好きなように脚本実行を調整することができます.

脚注
詳細はこちら
  • 脚本:劇集
  • Play :一連のホスト上で動作する一連のタスク
  • タスク:ホストに適用される具体的なアクション
  • ロール:自己定義責任を果たすためにホストを提供する一連のタスク