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

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

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

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

Q&A

0回答

659閲覧

ansible処理でディレクトリ配下のファイルをターゲットとする時

flavor

総合スコア0

Ansible

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

0グッド

0クリップ

投稿2022/10/04 07:04

編集2022/10/04 07:53

リモートサーバ側に下記のようなディレクトリ構成があります
ローカルPCからansibleコマンド実行して、このリモート側のディレクトリ/usr/local/test/20******/配下にあるfileに対してtest.shを実行させることが目的です
このplaybook内のchdirに/usr/local/test/20
*****/を指定させる時、20******のディレクトリを正規表現として記載出来るのでしょうか
ワイルドカード指定すると、下記のメッセージが出ました

「そのようなファイルやディレクトリはありません: '/usr/local/test/*'",」

date_dir_pathに{{ lookup('pipe','date +%Y%m%d') }}を指定すると現在の日時のものを生成するようですので
やりたい事に合致しません

日付指定ディレクトリをターゲットとする時にどのような記述とすればよろしいかご教示ください

■ ディレクトリ

/usr/local/test/20200401/file1 /usr/local/test/20200501/file2 /usr/local/test/20210401/file3 /usr/local/test/20210501/file4 /usr/local/test/20220401/file5 /usr/local/test/20220501/file6

■ playbook

- name: dir search command: test.sh args: chdir: "{{ date_dir_path }}" with_items: "{{ files }}"

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yabusakadeny

2022/10/05 00:39 編集

確認なのですが、 files 変数の中には何が入る想定でしょうか? また test.sh は、/usr/local/test/20******/ の各ディレクトリ内にそれぞれ存在する、ということでしょうか。 手動でやる場合はこう、というコマンドの羅列を少し記載いただくと、イメージ湧きやすくなりそうです。
flavor

2022/10/05 06:28 編集

ありがとうございます filesには、下記のように実行させる対象のfile名を指定します ----------------- vars/main.yml files: - file1 - file2 ----------------- tefileの中身 objectClass: organization o: testcom
yabusakadeny

2022/10/05 03:12 編集

ありがとうございます。 files 変数には、ファイル名(ここでは testfile)の文字列が入っているのですね。 タスクにはループごとに変わる変数 item が見受けられませんが、どのような事情でしょうか。 まだ、実現されたいことが理解できておらずすみません。 前述の質問や確認事項も再掲いたします。 1.test.sh は、/usr/local/test/20******/ の各ディレクトリ内にそれぞれ存在する、ということでしょうか。 2. 手動でやる場合はこう、というコマンドの羅列を少し記載いただくと、イメージ湧きやすくなりそうです。
flavor

2022/10/05 03:42 編集

ありがとうございます test.sh の中身はリモート側で ldapsearchして該当するファイルがあれば削除する内容です test.sh としなくても、直接コマンド実行でも問題ありません 手動で実行する場合は 検索 ldapsearch -h localhost -p 389 -LLL -W -D 'cn=aaa,dc=bbb,dc=com' -b 'ou=xxx.com,o=xxxcom,dc=bbb,dc=com' -f {{ item }} 削除 ldapdelete -x -W -D "cn=aaa,dc=bbb,dc=com" 'ou=xxx.com,o=xxxcom,dc=bbb,dc=com'-r 検索して該当のファイルがあれば削除することが目的です
flavor

2022/10/05 06:30

補足させてください filesには、実行させる対象の/usr/local/test/202*****/以下にあります file名を指定します
yabusakadeny

2022/10/06 12:45 編集

ありがとうございます。なかなか理解できずにすみません・・ /usr/local/test/20200401/file1 /usr/local/test/20200501/file2 がある状態で、仮にwith_items や変数を使わずにタスクを定義するとどのようになりますでしょうか。 いったん、べた書きの状態で、要件を理解したく思います。
flavor

2022/10/13 08:18 編集

お世話になっております 当方が教示いただきたく思いますのは /usr/local/test/yyyymmdd/以下にあるldif fileをldap検索したいことでして pathsに正規表現などを指定できるのでしょうか 検索結果を見て対象ldifファイルがあれば、当該ldap登録内容を削除させたいと思っています タスクですと下記となります paths部分は/usr/local/test/yyyymmdd/xxx.ldif yyyymmddなので以下のような形式で記載していますが、エラーとなるはずです - name: remoteサーバの/usr/local/test/以下を検索 find: paths: "/usr/local/test/202[012][0-9][0-9][0-9][0-9]/" recurse: "yes" # file_type: directory file_type: any command: ldapsearch -x -c -H ldap://127.0.0.1:10389 -LLL -D 'cn=aaa,dc=bbb,dc=com' -w {{ password }} -b test.ldif register: search - name: remoteサーバの/usr/local/test/のファイル登録を削除する command: ldapdelete -x -W -D "cn=aaa,dc=bbb,dc=com" 'ou=xxx.com,o=xxxcom,dc=bbb,dc=com'-r when: search.rc == 0 -------------- vars/main.yml --- password: xxx
flavor

2022/10/17 01:53 編集

ありがとうございます とりあえず、/usr/local/test/以下を findさせて その結果をregisterに格納させてから ldapsearchで対象の登録されているldap情報を検索して、 その結果で "rc": 0,となるので これをwhen で条件指定して ldapdeleteさせようとしましたが以下のエラーとなりました "msg": "The conditional check 'result.rc == 0' failed. The error was: error while evaluating conditional (result.rc == 0): 'dict object' has no attribute depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: ldap delete ldif file\n ^ here\n" when指定で誤りなどありますでしょうか お手数ですがご指摘いただけましたらと思います
jir01030

2022/10/13 10:27

ansibleのループの仕組み上、search ldfif fileのタスクのresult変数がリスト形式になるんですよね。。 result.results[0].rc = 0 みたいな形になると思います。 しかしながら、これだと複数あるldifファイルのうち、1つ目しか削除できないので要件は満たせないと思ってます。 debug: var: result などでどんな形式の変数が格納されているか確認してみると良いと思います。 複数の処理にまたがってループする場合は、include_tasksなどで2重ループするといいでしょう。 参考になりそうなブログ貼っときます https://dev.classmethod.jp/articles/loop_multi_tasks_using_include_and_loop_var/#toc-1
flavor

2022/10/13 11:02

ありがとうございます results[0]ですね。。 とりあえず的には、vars/delete_ldap_entry.ymlに 削除対象のldapエントリ属性を複数定義することで、複数のldapエントリを削除することは出来ます エントリがないものは"rc": 32でfailedになるので 誤った属性指定していることの確認にもなるのでいいのかとも思ってもいますが。。。 jir01030様教示ありましたtask処理を試してみます
yabusakadeny

2022/10/13 13:36

お伺いしておいてお力になれず申し訳ありませんでした・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問