自動運用保守ツールAnsible:(2) Playbookスクリプトの解説と適用

目次

1: プレイブックの概要

1.1 プレイブックの紹介

1.2 Ansible Playbook の使用シナリオ

1.3yaml の基本的な文法規則

1.4 yaml がサポートするデータ構造

1.5 例

2: インベントリの変数

2.1Inventor 変数パラメータ 

3: プレイブックの例 

3.1 タスクごとにリモート実行ユーザーを定義する 

3.2 リモートホストを指定してスクリプトを実行するユーザーを切り替える 

3.3tasks はエラーを無視し、強制的に成功を返します 

3.4 複数のホスト ノードに対してスクリプトを実行する 

3.5 ハンドラーの紹介

3.6 変数の導入 

3.6.1 ansible コマンド パラメーター -e を介して渡される

3.6.2 yaml または組み込み変数で直接定義する 

3.6.3 ホスト リストでカスタム変数を参照する 

3.7 状態試験 

3.7.1 単一条件判定

3.7.2 複数条件判定 

3.7.3 グループ条件判定 

3.7.4 反復

1: プレイブックの概要

1.1 プレイブックの紹介

playbook は、制御対象ノードを構成、デプロイ、および管理するための ansible スクリプトです。プレイブックの詳細な説明により、一連のタスクを実行することで、リモート ホストを期待される状態に到達させることができます。Playbook は、制御対象ノードに対して Ansible コントローラーによって一覧表示される一連の to-do リストのようなものであり、制御対象ノードを完了する必要があります。このように解釈することもできます. Playbook の文字通りの意味はスクリプトです. 実際にはアクターはスクリプトに従って実行します. Ansible では、今度はコンピューターがパフォーマンスを実行し、アプリケーションをインストールし、デプロイし、外部サービスを提供し、さまざまなタスクを処理するためにコンピューターを編成します。

Playbook はスクリプトです。つまり、
タスクを通じて ansible モジュールを呼び出すことで、複数の Play が整理され、Playbook で実行されます。

プレイブック自体は、次の部分で構成されています。

  • タスク: タスク、つまり、モジュールを呼び出すことによって完了する特定の操作です。原則はトランザクションと同じで、一緒に実行されるか、一緒に実行されません。
  • 変数: 変数。変数を宣言するための 3 つのシナリオ: ホスト ファイルで定義、スクリプトで定義、コマンドで -e を使用して定義。
  • テンプレート: テンプレート; 同じ形式のテンプレートを定義して、形式が異なるために各サービスが互換性を持たない可能性があるという問題を解決します。
  • ハンドラー: プロセッサーは、特定の条件が満たされると、操作の実行をトリガーします
  • 役割: 役割; 互いに干渉することなくタスクを分類して実行する

プレイブックのコア要素:

  • ホスト:ホスト グループ;
  • タスク:タスク リスト;
  • 変数:変数、4 つの設定方法があります。
  • テンプレート:テンプレート構文を含むテキスト ファイル。
  • ハンドラー:特定の条件によってトリガーされるタスク。

1.2  Ansible Playbook の使用シナリオ

  • いくつかの単純なタスクでは、アドホック コマンドを使用して問題を便利に解決できますが、機能が複雑すぎて多くの操作が必要な場合、アドホック コマンドは実行に適していません。時間。
  • シェル コマンドを実行してシェル スクリプトを記述するのと同じように、バッチ タスクとしても理解できますが、playbook には独自の構文形式があります。
  • Playbook を使用すると、これらのコードを簡単に再利用して別のマシンに移植することができ、関数と同様に、コードを最大限に活用できます。Ansible を使用すると、処理する操作のほとんどが Playbook の作成であることがわかります。一般的なアプリケーションを Playbook に書き込めば、サーバーの管理が非常に簡単になります。

1.3yaml の基本的な文法規則

Playbook yaml 構文は、改行と 2 つのスペースであり、- and: の後にはスペースが必要です。

YAML: 非マークアップ言語です。これは、構成ファイルを作成するために使用される言語であり、非常に簡潔で強力です。

YAML 構文は他の言語に似ており、ハッシュ テーブルやスカラーなどのデータ構造も表現できます。

構造はスペースで表示され、シーケンス内の構成項目は - で表されます; Map 内のキー値は: で区切られます; YAML の拡張子は yaml です

  1. 大文字と小文字を区別
  2. インデントを使用して階層関係を示す
  3. インデント時にタブは使用できません。スペースのみ使用できます
  4. 同じレベルの要素が左揃えである限り、インデントされるスペースの数は重要ではありません

文法導入:

  1. 1 つのファイル内で、3 つの連続するハイフン (---) を使用して、複数のファイルを区別できます。さらに、ファイルの終わりを示すために使用されるオプションの連続した 3 つのドット ( ... ) があります。
  2. 次の行は Playbook の内容を普通に書き始めます。通常は Playbook の関数を書くことをお勧めします。
  3. # を使用してコードをコメントする
  4. インデントは均一にする必要があり、スペースとタブを混在させることはできません
  5. インデントのレベルも一貫している必要があります. 同じインデントは同じレベルを表します. プログラムは、インデントと改行を組み合わせることによって構成レベルを区別します.
  6. YAML ファイルの内容は大文字と小文字を区別し、k/v の値は大文字と小文字を区別する必要があります
  7. k/v の値は、同じ行または新しい行に書き込むことができます。ピア使用:分離
  8. v は文字列または別のリストにすることができます
  9. 完全なコード ブロック関数には、name: task を含む最小限の要素が必要です。
  10. 名前には 1 つのタスクのみを含めることができます
  11. YAML ファイルの拡張子は、通常 yml または yaml です。
ホスト グループにすることができるノードを定義します
リモートユーザー どのユーザーとしてログインしていますか?
タスク あなたの仕事です
なる:はい ユーザーの切り替えを示します
become_user: mysql 前のユーザーと組み合わせて使用​​される mysql ユーザーへの切り替えを示します
- 名前: 以下で実行されるアクションに名前を付けます

1.4 yaml がサポートするデータ構造

  1. オブジェクト:マッピング/ハッシュ/辞書とも呼ばれるキーと値のペアのコレクション
  2. Array:順番に並べられた値のセットで、sequence (シーケンス) / list (リスト) とも呼ばれます。
  3. スカラー:単一の分割できない値

1. オブジェクト: マッピング (マッピング) / ハッシュ (ハッシュ) / 辞書 (辞書) とも呼ばれるキーと値のペアのコレクション 例: 名前:
テスト開発者
     変数名: オブジェクト名属性

2. Array: 順番に並べられた値のセットで、sequence (シーケンス) / list (リスト) とも呼ばれます。
例: -Apple
     -Green

3. スケール: 1 つの分割できない値
例: 数値: 17.50
     変数名: 値

1.5 例

---
#安装与运行mysql服务
- hosts: node1
  remote_user: root
  tasks:
 
    - name: install mysql-server package
      yum: name=mysql-server state=present
    - name: starting mysqld service
      service: name=mysql state=started

上記の例の mysql.yml のように、ファイル名は .yml で終わる必要があります。その中には、次の 3 つの部分があります。

hosts: 次のタスクを実行するためにどのホストまたはホスト グループが使用されるかを示すには、ホストを使用します. 各 Playbook はホストを指定する必要があり、ホストはワイルドカードを使用することもできます. ホストまたはホスト グループはインベントリ リストで指定されます。システムのデフォルトの /etc/ansible/hosts を使用するか、自分で編集して、実行時に -i オプションを追加し、リストの場所を指定できます。インベントリ ファイルを実行するときに、 --list-hosts オプションを指定すると、タスクの実行に参加するホストが表示されます。

remote_user: リモートシステムにログインするリモートホストのユーザーを指定します. リモートシステムでタスクを実行するユーザーは任意に指定できます.またはsudoを使用することもできます. .

tasks: リモート ホストによって実行される一連のアクションを指定します。タスクのコアは ansible のモジュールであり、モジュールの使用法は前述のとおりです。tasks には名前と実行するモジュールが含まれます. ユーザーが読みやすいように名前はオプションですが, 追加することをお勧めします. モジュールは必須であり, 対応するパラメータもモジュールに与える必要があります.

テンプレート: テンプレート構文を含むテキスト ファイル。

ansible-playbook を使用して Playbook ファイルを実行し、JSON 形式の次の出力情報を取得します。また、識別しやすいようにさまざまな色で構成されています。一般的に言えば:

| 緑は実行が成功し、システムがそのまま残っていることを意味します

| 黄色はシステムを意味し、システムの状態が変化したことを意味します

| 赤は実行が失敗したことを意味し、エラー出力が表示されます

実行には 3 つのステップがあります。

  1. 事実を集める
  2. タスクを実行する
  3. 結果を報告する

2: インベントリの変数

Inventory は、Ansible がホスト情報を管理するための構成ファイルで、システムの HOSTS ファイルの機能に相当し、デフォルトで /etc/ansible/hosts に格納されます。

ホスト リストは、手動で設定することも、ダイナミック インベントリを介して動的に生成することもできます

ホスト リスト:

vi /etc/ansible/hosts
[webserver] # 角括弧を使用してグループ名を設定します
www1.example.org # 監視対象のホストを定義します。ここにはホスト名または IP アドレスを指定できます
www2.example.org:2222 #Defineコロンの後のリモート接続ポート。デフォルトは ssh のポート 22 です。

類似した名前のホストがある場合は、リストを使用して各ホストを識別できます

[webserver]
//[01:50]表示匹配从01到50,后面跟着内置变量,这里定义了ssh的访问的用户名和密码,用于免交互登录
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=abc123
 
[dbbservers]
//[a:f]表示支持匹配a到f
db-[a:f].example.org

インベントリの変数

1. ホスト変数

[webserver]
//定义变量http_port(开放的端口信息)和maxRequestsChild(最大进程数)
www1.magedu.com http_port=80 maxRequestsChild=808
www2.magedu.com http_port=8080 maxRequestsChild=909

2. グループ変数

[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

3. グループの入れ子 

[apache]
http1.example.org
http2.example.org
 
[nginx]
ngx1.example.org
ngx2.example.org
//定义一个组名,将刚才定义的两个组名放入,即webservers组包含apache组和nginx组的主机
[webservers]
apache
nginx

2.1Inventor 変数パラメータ 

パラメータ 例証する
ansible_ssh_host 接続するリモートホストの名前が、設定したいホストのエイリアスと異なる場合は、この変数を介して設定できます
ansible_ssh_port ss ポート番号、デフォルトのポート番号でない場合は、この変数で設定します
ansible_ssh_user デフォルトの ssh ユーザー名
ansible_ssh_pass ssh パスワード (この方法は安全ではありません。 --ask-pass または SSH キーを使用することを強くお勧めします)
ansible_ssh_private_key_file 複数の鍵があり、SSH エージェントを使用したくない状況に適した、ssh で使用される秘密鍵ファイル
ansible_ssh_common_args この設定は、sftp、scp、および ssh のデフォルトのコマンド ラインに追加されます。
ansible_sftp_extra_args この設定は、デフォルトの sftp コマンドラインに追加されます
ansible_scp_extra_args この設定は、デフォルトの scp コマンド ラインに追加されます
ansible_ssh_extra_args この設定は、デフォルトの ssh コマンド ラインに追加されます。
ansible_ssh_pipelining SSH パイピングを使用するかどうかを決定します。これは、設定を取得するために ansible.cfg でオーバーライドできます。
ansible_shell_type ターゲット システムのシェル タイプ デフォルトでは、コマンドは sh 構文を使用して実行され、csh または fish に設定できます。
ansible_python_interpreter 状況に適用可能なターゲット ホストの python パス: システムに複数の python があるか、コマンド パスが「/usr/bin/python」ではない
ansible_*_インタープリター ここの * は、Ruby または Perl またはその他の言語のインタープリターにすることができます。これは ansible_python_interpreter に似ています。
ansible_shell_executable これにより、ターゲット マシンで ansible コントローラーが使用するシェルが設定され、ansible.cfg の構成が上書きされます。デフォルトは /bin/sh です。

3: プレイブックの例 

基本コマンドの紹介

格式:
ansible-playbook [yaml文件名]
例如:ansible-playbook ping.yml
参数:-k(–ask-pass) 用来交互输入ssh密码
     -K(-ask-become-pass) 用来交互输入sudo密码
     -u 指定用户
 
补充命令:
ansible-playbook XXXX.yaml --syntax-check   #检查yaml文件的语法是否正确
ansible-playbook XXXX.yaml --list-task      #检查tasks任务
ansible-playbook XXXX.yaml --list-hosts     #检查生效的主机
ansible-playbook XXXX.yaml --start-at-task='ensure apache is at the latest version'  #指定从某个task开始运行
パラメータ 例証する
-k(-アスクパス) 対話的に ssh パスワードを入力するために使用されます
-K(-ask-become-pass) sudo パスワードを対話的に入力するために使用されます
-u 指定ユーザー
-e 変数値のインポート

ホストとユーザーの紹介

 - hosts: webserver   #指定主机组,可以是一个或多个组
   remote_user: root  #指定远程主机执行的用户名

3.1 タスクごとにリモート実行ユーザーを定義する 

cd /opt
vim 1.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: test connection
    ping:
    remote_user: mysql    #指定远程主机执行tasks的运行用户为mysql
	
ansible mysql -m user -a 'name=mysql'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin mysql'
ansible-playbook 1.yaml -k
123123

3.2 リモートホストを指定してスクリプトを実行するユーザーを切り替える 

vim 2.yaml
 
- hosts: mysql
  remote_user: root
  become: yes         
  become_user: mysql   
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/mysql/fstab.bak
 
ansible-playbook 2.yaml

mysql ホストでコピーされたファイルを表示する

ls /home/mysql

複数のホストを yaml ファイルに記述でき、複数のホスト グループを定義できます

vim hosts.yaml
- hosts: webserver
  remote_user: root
  tasks:
   - name: create nginx group
     group: name=nginx system=yes gid=208
   - name: create nginx user
     user: name=nginx uid=208 group=nginx system=yes
- hosts: mysql
  remote_user: root
  tasks:
   - name: copy file to mysql
     copy: src=/etc/inittab dest=/opt/inittab.back

3.3tasks はエラーを無視し、強制的に成功を返します 

1. Play の主要部分はタスク リストです. タスク リスト内のタスクは、 hosts で指定されたホスト上で 1 つずつ順番に実行されます. つまり、最初のタスクがすべてのホストで完了してから開始されます. Playbook の実行時 (上から順に実行)、ホストがタスクの実行に失敗した場合、タスク全体がロールバックされます。Playbook のエラーを修正してから再実行してください。 task は、指定されたパラメーターでモジュールを実行することであり、in 変数はモジュール パラメーターで使用できます。モジュールは実行時にべき等です。つまり、結果が確実であるため、複数回実行しても安全です。
2. 各タスクには名前が必要です。これにより、プレイブックを実行するときに、それが出力するタスク実行情報から、それがどのタスクに属しているかを明確に識別できます。
3. 共通の形式でタスクを定義します: "module: options" 例: yum: name =httpd
4. ansible の組み込みモジュールのうち、コマンド モジュールとシェル モジュールは key=value を使用する必要はありません。フォーマット

エラーの例: エラーが発生するとタスクは自動的に停止し、Apache サービスはインストールを続行しません

vim 3.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
 
ansible-playbook 3.yaml

ignore_errors: True を追加してエラーを無視し、エラーが報告された後も実行を続行します 

vim 3.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
    ignore_errors: True
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
                                                   
ansible-playbook 3.yaml                       

3.4 複数のホスト ノードに対してスクリプトを実行する 

vim 4.yaml
  
- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: src=/etc/fstab dest=/opt/haha.txt

3.5 ハンドラーの紹介

ハンドラーもタスクのリストであり、通常のタスクと変わりません。
通知は notifier によって行われます.通知されない場合は Handlers は実行されません.通知された場合は Handlers が実行されます.何個の notifier が通知したとしても,play 内のすべてのタスクが実行された後,ハンドラも実行されます。一度だけ実行されます

vim 5.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent
 
  - name: start firewalld
    service: name=firewalld state=started
 
  - name: setenforce 0 && install httpd
    command: '/usr/sbin/setenforce 0'
    notify:
    - step one
 
  - name: stop firewalld && start httpd
    service: name=firewalld state=stopped
    notify:
    - step two
 
  handlers:
 
  - name: step one
    yum: name=httpd
 
  - name: step two
    service: name=httpd state=started
 
 
ansible-playbook 5.yaml

3.6 変数の導入 

Playbook に変数を導入するには、次の 3 つの方法があります。

  1. ansible コマンド パラメーター -e を介して渡される
  2. yaml で直接定義する
  3. ホスト マニフェストで定義された変数を参照します

3.6.1 ansible コマンド パラメーター -e を介して渡される

执行命令: ansible-playbook a.yml -e "user=wangwu"
 
执行命令查看: ansible mysql -m command -a 'tail /etc/passwd'
vim 6_1.yaml
 
- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add user
    user: name={
   
   {user}}
 
ansible-playbook 6_1.yaml -e "user=wangwu"
ansible mysql -a 'tail -1 /etc/passwd'

3.6.2 yaml または組み込み変数で直接定義する 

vim 6_2.yaml
 
- hosts: mysql
  remote_user: root
  vars:
  - user: lisi
  tasks:
  - name: add user
    user: name={
   
   {user}}
 
ansible-playbook 6_2.yaml
ansible mysql -a 'tail -1 /etc/passwd'
vim 6_2.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{
   
   {ansible_all_ipv4_addresses}}" dest=/opt/vars.txt
 
ansible-playbook 6_2.yaml
ansible mysql -a 'ls /opt'
ansible mysql -a 'cat /opt/vars.txt'

3.6.3 ホスト リストでカスタム変数を参照する 

vim /etc/ansible/hosts
 
[webserver]
192.168.184.20
[mysql]
192.168.184.30  user=zhaoliu
 
vim 6_3.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: add user
    user: name={
   
   {user}}
 
ansible-playbook 6_3.yaml
ansible mysql -a 'tail -1 /etc/passwd'

3.7 状態試験 

タスクの実行の前提条件として、変数、ファクト (セットアップ)、または以前のタスクの実行結果を使用する必要がある場合は、Playbook の条件付きテストで使用される条件付きテストを使用する必要があります。タスクの後に when 句を追加して、条件テストを使用します: when 句が jinjia2 の式または構文をサポートする

3.7.1 単一条件判定

vim 7_1.yaml
 
 - hosts: mysql
   remote_user: root
   tasks:
     - name: "shutdown CentOS"
       command: /sbin/shutdown -h now
       when: ansible_distribution == "CentOS"
 
ansible-playbook 7_1.yaml

3.7.2 複数条件判定 

vim 7_2.yaml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 7 systems"
    command: /sbin/shutdown -r now
    when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"
 
ansible-playbook 7_2.yaml

3.7.3 グループ条件判定 

vim 7_3.yml
 
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shut down CentOS 6 and Debian 7 systems"
    command: /sbin/shutdown -t now
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
 
ansible-playbook 7_3.yaml

3.7.4 反復

繰り返し実行する必要があるタスクがある場合は、反復メカニズムを使用できます。その使用形式は、item 変数参照として反復する必要があるコンテンツを定義し、with_itemsステートメントで反復を指定することです。

vim 7_5.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: install
    yum: name={
   
   {item}} state=latest
    with_items:
    - httpd
    - rpcbind
    - nfs-utils
 
ansible-playbook 7_5.yaml
ansible webserver -a 'rpm -q httpd'
ansible webserver -a 'rpm -q rpcbind'
ansible webserver -a 'rpm -q nfs-utils'

アイテム変数を自分で定義することもできます 

vim 7_5.yaml
 
- hosts: webserver
  remote_user: root
  tasks:
  - name: add user && join group
    user: name={
   
   {item.x}} state=present group={
   
   {item.y}}
    with_items:
    - {x: 'qianqi', y: 'wheel'}
    - {x: 'sicong', y: 'root'}
 
ansible-playbook 7_5.yaml
ansible webserver -a 'tail -2 /etc/passwd'

その中で、
name は操作するソフトウェア パッケージの名前を示し、
state は実行する操作を示します;
present: デフォルト、インストールを意味します;
lastest: 最新バージョンのインストールを意味し、
absent: 削除を意味します。

おすすめ

転載: blog.csdn.net/ver_mouth__/article/details/126214769