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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

解決済

自作のAnsibleモジュールをconnection: localでrole中で実行するとfilesディレクトリを見てくれない

neocorno
neocorno

総合スコア0

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

1回答

1評価

0クリップ

2684閲覧

投稿2016/10/10 03:04

編集2022/01/12 10:58

前置き

[motemen/ghq](https://github\.com/motemen/ghq\)を使ったAnsible module を自作しました。

[https://github\.com/suzuki-shunsuke/ansible-ghq-module\]\(https://github\.com/suzuki-shunsuke/ansible-ghq-module\)

モジュール本体のコードは[こちら](https://github\.com/suzuki-shunsuke/ansible-ghq-module/blob/master/ghq\.py\)

ghq import < FILE としてインポートするファイルをタスクのsrcパラメータとして指定できるようにしています。

yaml

# ghq import < repos\.txt ghq: src: repos\.txt

困っていること

Vagrant を使ってテストをしたところ、
リモートサーバに対してはうまく行く(Vagrantのansible provisionerでテスト)のですが、

* Vagrantの ansible local provisioner を使った場合
* playbookでconnection: local を指定した場合

のいずれの場合でも次のようなエラーが発生してしまいます。

fatal: \[localhost\]: FAILED! => {"changed": false, "failed": true, "msg": "Source repos\.txt not found"}

roleのfilesディレクトリにソースとなるファイル(今回はrepos.txt)を配置しており、
パーミッションも問題ないのですが(ちゃんとread権限がある)、
どうも roleの filesディレクトリ配下を参照できていない様に思えます。

質問

* Vagrantの ansible local provisioner を使った場合
* playbookでconnection: local を指定した場合

でも上手く動作するようにするにはどうすればよろしいのでしょうか?

実行環境

* ホストOS: Arch Linux
* ゲストOS: Ubuntu 16.04
* Python 2.7.12 (ホスト、ゲストともに)
* Ansible version: 2.1.1.0 (ホスト、ゲストともに)
* Vagrant version: 1.8.6

再現方法

* Vagrant
* Ansible

がインストール済みの前提で

\$ git clone https://github\.com/suzuki-shunsuke/ansible-ghq-module \$ cd ansible-ghq-module \$ sh _setup\.sh \$ vagrant up --provision # ここでテストが実行される

補足

ファイルを参照する処理については
ansibleのfileモジュールやcopyモジュールのコードを参考にしました。

[copy モジュールのソースコード](https://github\.com/ansible/ansible-modules-core/blob/17ee1cfaf960d99bd3fee7631f86b1013957ec70/files/copy\.py\)

copyモジュールのsrcを参照するコードは次のようになっています(一部抜粋)。

python

module = AnsibleModule\( argument_spec = dict\( src = dict\(required=False\), \), add_file_common_args=True, supports_check_mode=True, \) src = os\.path\.expanduser\(module\.params\['src'\]\) if not os\.path\.exists\(src\): module\.fail_json\(msg="Source %s not found" % \(src\)\)

上のコードはplaybookで指定されたsrcパラメータを os.path.expanduserに渡したものを
os.path.existsで存在チェックしているだけです。

copyモジュールのsrcパラメータは

* Vagrantの ansible local provisioner を使った場合
* playbookでconnection: local を指定した場合

いずれの場合でもきちんと動作しているように思えます。

それと同様の処理を自作のモジュールでも行っているつもりなのですが、何故か動作しません。


以上、何卒よろしくお願いいたします。
情報が足りなければ追記いたしますので、お申し付けください。

良い質問の評価を上げる

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

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

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

気になる質問をクリップする

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。