質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

ansible 複数ターゲットへの設定変更

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,293

score 15

ansibleで複数ターゲットに設定値に差分ががある設定を一括管理するにはどういった指定方法がいいのでしょうか?

host_varsを使うようなのを聴きましたがうまく構築できません。import_playbookで呼び出していく方法も考えましたがどういった手法がいいのでしょうか。

主にやりたいこと
複数サーバのネットワーク設定等


少し進んだので更新します
import_playbookでは読みだすplaybookでターゲット指定はできますが、呼び出し元のplaybookではターゲット指定はできませんでした。イメージは以下です。出来たらよかったですが...

- hosts: X.X.X.X
  import_playbook: XXX

なのでやり方を変えて進めてます。
参考:https://qiita.com/tanuki_mujina/items/43aa769c2ddc8a3a98f9

ターゲットのアドレスを変数にし、別ファイルに作成して呼び出すやり方です。
ターゲット分のファイルは必要になりますが簡単に作成できるかと思いました。
呼び出すファイルにモジュールのパラメータ値も変数として格納したら同じように呼び出そうとしたがうまくいきません。
以下に実際の構文を載せます。この内容で設定値まで一緒に変数として格納はできないのでしょうか。もしくはモジュール内ファイル/変数の呼び出しが必要になるのでしょうか。。。

・inventoryファイル
Client01

・Client01.yml
---
ipaddr: 192.168.0.1
new_ipaddr: 172.16.0.10
new_prefix: 24
new_gateway: 172.16.0.200

・playbook.yml
---
- hosts: all
  vars_files:
    - vars/{{ansible_hostname}}.yml
  tasks:
  - name:ipv4設定
 lineinfile:
    dest: /etc/sysconfig/network-scripts/ifcfg-eth0
    line: "{{ item }}"
  with_items:
    - IPADDR="new_ipaddr"
    - PREFIX="new_prefix"
    - GATEWAY="new_gateway"
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

inventory、varsファイルについては問題なさそうです。
task部分は要修正です。

- name:ipv4設定

":"の後にスペースが必要です。

 lineinfile:

モジュール名の前に全角スペースが混入しています。
インデントも足りません。

  - IPADDR="new_ipaddr"
  - PREFIX="new_prefix"
  - GATEWAY="new_gateway"

各値が、変数でなく、単なる文字列として呼ばれています。
変数を呼ぶ場合は、ブレースで括る必要があります。

以上を踏まえて、書き直したplaybook例を以下に記載します。

- hosts: all
  vars_files:
    - vars/{{ansible_hostname}}.yml
  tasks:
  - name: ipv4設定
    lineinfile:
      dest: /etc/sysconfig/network-scripts/ifcfg-eth0
      line: "{{ item }}"
    with_items:
      - "IPADDR={{ new_ipaddr }}"
      - "PREFIX={{ new_prefix }}"
      - "GATEWAY={{ new_gateway }}"

これで一応動作するplaybookは書けるかと思いますが、いくつか補足です。

  • 当初の「ansibleで複数ターゲットに設定値に差分ががある設定を一括管理する」という目的に
    対しては、参照されているqiita記事のコメントにあるhost_vars、あるいは、group_vars、facts等の
    利用が手段としてあるかと思います。今回のパターンは、task、roleよりかはホストに
    紐づく情報、かつ、純粋に追加設定のためfactsでも採れないので、個人的にはhost_varsで
    定義しておくと後々の管理が楽かなと思います。hosts_varsに関して、うまくいかなかったと
    おっしゃられている部分について、具体的にご説明いただければ、助力できるかもしれません。

  • Ansibleが疎通しているインタフェースの設定をAnsibleから変更する際は、十分検証してから
    実施されることをお勧めします。

  • ifcfgのようなファイルは、lineinfileモジュールで追記すると、後に設定変更が生じた場合に
    少々つらいかと思いますので、templateモジュールの利用をお勧めします。

もう少し細かくご説明すべきかとも思いましたが、観点が増えすぎて収集が
つかなくなりそうでしたので、一旦以上とさせていただきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/12 02:42

    回答ありがとうございました。修正したところ上手く動きました。またネットワーク設定の際の管理NWは別に分けておいた方が良いですね。
    気になっているのですが今回、複数台サーバに設定値の違うモジュール実行をしましたが、この複数台中の特定のサーバにだけ別のモジュールを実行しようとしたら、別のplaybookを作成・実行するしかないのでしょうか?

    用途を分けたplaybookを作成し、管理していくのが整理もついて良いと考えてはいるのですが、上記のようなやり方はそもそもできるのかできないのかが判断がつきません。もしお時間あればご教授頂けないでしょうか?

    キャンセル

  • 2020/02/12 02:48

    少し意図がわかりづらいかもしれませんが、1つのplaybookでモジュールごとに対象のサーバ又はグループを記述し、設定していくというものです。基本的なplaybookは冒頭に対象サーバを記述し、それ以降でモジュールを書いていくだけだと認識しています。

    キャンセル

  • 2020/02/13 01:20

    結果のご報告、ありがとうございます。うまくいって何よりです。

    モジュールの実行分けの件ですが、例えば、Playbook内の特定のtaskについて、Inventory上で定義しているノード名/グループ名を条件として、特定のノード名/グループ名に合致する場合のみ実行したい、ということであれば、whenステートメントと、fact変数かmagic変数を組み合わせれば実装可能です。
    コメント欄では色々不都合があるため、詳細は割愛させていただきます。一度ご自分でお調べいただき、行き詰ったら、質問の別建てをご検討ください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る