無能な脚本


ansibleはコードとしてインフラストラクチャを有効にします.それは私のための貴重なツールでしたinfrastructure@homeプロジェクトConsulとNomadをセットアップするのを手伝って、ノードとサービスのためにDNSを提供するために、そして、NGinx終点.このインフラストラクチャは完全にKubernetesに置き換えられましたが、Ansibleは、システムメンテナンスタスクの継続的なサポートを維持し、提供するツールです.
より長い時間のためにansibleで働いたので、私のスクリプトは現在よく構造化されたディレクトリに存在します.ここから、私は完全な実行と同様に個々の仕事を走らせることができますsite.yml 一貫した設定状態をすべてのシステムに適用します.また、不要な設定やソフトウェアを削除するアンインストーラを考慮することも有用です.そして、あなたの脚本の譲歩を達成するために、それは本当にあなたが使用している可能性の高いモジュールを理解することが重要です.これらのすべてはこの記事で詳細です.

効果的ディレクトリレイアウト
すべての可用性のあるコードは1つのディレクトリ内に含まれます.この記事を書くとき、このディレクトリは次のようになります.
├── ansible.cfg
├── host_vars
│   ├── raspi-3-1.yml
│   ├── ...
├── group_vars
├── roles
│   ├── consul
│   ├── docker-arch
│   ├── docker-arm
│   ├── nfs-client
│   ├── nfs-server
│   └── nomad
├── scripts
│   ├── consul
│   ├── nomad
│       ├── configs
│       ├── jobs
│   ├── system
│       ├── update_packages.yaml
│   ├── tutorial
│   └── uninstall
├── hosts
└── site.yml
ディレクトリはこれらの原理に従って構造化されます:
  • ディレクトリルートのグローバル設定ファイルansible.cfg とインベントリhosts .
  • グローバル・プレイブックsite.yml 実行されるとき、私が持っているすべてのインフラストラクチャシステムですべてのノードを設定します.効果的にすべてのノードにすべてのロールをインストールし、ノードを最新のOSパッケージにパッチします.
  • グローバルVarsgroup_vars ディレクトリにはグローバル変数、特にNOMAD、Consul、NFSサーバのIPアドレスが含まれます.にhost_vars ディレクトリには、ノードまたはエージェントとしてNOMAD/consul/NFSの役割を決定する各ノードのファイルが含まれます.
  • 役割とスクリプトの分離roles ディレクトリには、インフラシステムをインストールする脚本が含まれます.これらは以前の記事で説明したもっともらしい役割です.インscripts は定期的に実行されるコマンドです.ノードの更新やノードの再起動のようなものです.また、スクリプトディレクトリ内のプログラム用の設定ファイルも含め、nomadジョブの展開も含みます.

  • アンインストーラ
    Ansibleは、システムのための返済可能な、一貫した構成を提供することに関係しています.しかし、時々これらの変更を取り消す必要があります.それがちょうど各々のパッケージ管理ソフトウェアでソフトウェアをアンインストールするならば、これは簡単な仕事です.しかし、他の設定については:カスタムサービスファイル、設定ファイル、などの中央システムファイルに設定行を追加/etc/mount or /etc/ssh/sshs_config ?
    アンインストーラはありませんが、すべての変更を元に戻すことができます.このアンインストーラ自身を書いてください!あなたの心に新鮮なので、あなたのシステムでそれをテストすることができますので、インストールの部分で完了したらすぐにそれを書いてください.
    脚本を作るinstall and uninstall ブロック.これらのブロックはuninstall=true パラメータを実行します.
    ここでインストールするための簡単な例ですdnsmasq .
    - block:
        - name: Install dnsmasq
          apt:
            name: dnsmasq
            state: present
        - name: Configure dnsmasq
          lineinfile:
            path: /etc/dnsmasq.d/10_consul
            create: true
            line: server=/consul/192.168.2.201#8600
            regexp: consul
            state: present
      when: uninstall is not defined
    
    - block:
        - name: Uninstall
          apt:
            name: dnsmasq
            state: absent
        - file:
            path: /etc/dnsmasq.d
            state: absent
      when: uninstall is defined and uninstall
    
    この脚本がansible-playbook ... -e "{uninstall: true} , 出力は以下の通りです.
    ansible-playbook site.yml --limit=raspi-3-1 --tags dns -e "{uninstall: true}"
    
    
    PLAY [Configure DNS] ***********************************************************************************************************************
    
    TASK [dns : Install dnsmasq] ***************************************************************************************************************
    skipping: [raspi-3-1]
    
    TASK [dns : Configure dnsmasq] *************************************************************************************************************
    skipping: [raspi-3-1]
    
    TASK [dns : Restart dnsmasq] ***************************************************************************************************************
    skipping: [raspi-3-1]
    
    TASK [dns : Uninstall] *********************************************************************************************************************
    changed: [raspi-3-1]
    
    TASK [dns : file] **************************************************************************************************************************
    changed: [raspi-3-1]
    

    演劇
    脚本がシステムを構成するために実行されるとき、システムは常に同じ、よく定義された状態を持つべきです.脚本が10のステップから成る、そして、システムが望ましい状態からステップ4で逸脱するならば、この特定のステップだけは適用されなければなりません.
    その性質によって、何かすることがあるならば、不可解な仕事はシステムを変えるだけです.最も可能なモジュールはこの潜在性を提供します.しかし、いくつかのモジュールをこのパターンを破る方法で使用できます.私はすべてのモジュールをカバーできませんが、この点を1つの例で強調したいLine in File .
    NFSボリュームを取り付けるセットアップを考えましょう.クライアントでは、エントリを追加する必要がありますetc/fstab NFSサーバがあるシステムを伝えるために.この変更の最初のバージョンは以下の通りです.
    - name: Create fstab entry
      lineinfile:
        path: /etc/fstab
        line: '{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}  {{ nfs_dir_mnt_path }} nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0'
        state: present
    
    特定の出力は3つの変数に依存します.変数の1つが変更され、脚本が再び実行されると、新しいエントリが作成されます/etc/fstab . マウントは動作しません!
    このファイルのNFS株式のエントリは1つだけです.そして、このためにregexp パラメータこの脚本の第2版はregexp 1つの行だけを追加する/etc/fstab . この単純な変更は、プレイブックを可能にする.
    - name: Create fstab entry
      lineinfile:
        path: /etc/fstab
        line: '{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}  {{ nfs_dir_mnt_path }} nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime  0 0'
        regex: 'nfs defaults,soft,bg,noauto'
        state: present
    
    モジュールを使用するときはいつでも、それを使うように注意してください.

    結論
    Ansibleの連続使用の間、個々のスクリプトの私のコレクションは1つの有効なディレクトリ構造に発展しました.正確にどこにどの脚本、変数や設定ファイルを置くことを知って不可欠です.また、脚本を書くときは、アンインストーラを追加してシステムを変更することもできます.最後に、繰り返しプレイブックの実行は常に1つのよく定義された、一貫したシステムの状態になるように、iDemanceの脚本を書くようにしてください.