リモートサーバ側に下記のようなディレクトリ構成があります
ローカル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 }}"
確認なのですが、 files 変数の中には何が入る想定でしょうか?
また test.sh は、/usr/local/test/20******/ の各ディレクトリ内にそれぞれ存在する、ということでしょうか。
手動でやる場合はこう、というコマンドの羅列を少し記載いただくと、イメージ湧きやすくなりそうです。
ありがとうございます
filesには、下記のように実行させる対象のfile名を指定します
-----------------
vars/main.yml
files:
- file1
- file2
-----------------
tefileの中身
objectClass: organization
o: testcom
ありがとうございます。
files 変数には、ファイル名(ここでは testfile)の文字列が入っているのですね。
タスクにはループごとに変わる変数 item が見受けられませんが、どのような事情でしょうか。
まだ、実現されたいことが理解できておらずすみません。
前述の質問や確認事項も再掲いたします。
1.test.sh は、/usr/local/test/20******/ の各ディレクトリ内にそれぞれ存在する、ということでしょうか。
2. 手動でやる場合はこう、というコマンドの羅列を少し記載いただくと、イメージ湧きやすくなりそうです。
ありがとうございます
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
検索して該当のファイルがあれば削除することが目的です
補足させてください
filesには、実行させる対象の/usr/local/test/202*****/以下にあります
file名を指定します
ありがとうございます。なかなか理解できずにすみません・・
/usr/local/test/20200401/file1
/usr/local/test/20200501/file2
がある状態で、仮にwith_items や変数を使わずにタスクを定義するとどのようになりますでしょうか。
いったん、べた書きの状態で、要件を理解したく思います。
お世話になっております
当方が教示いただきたく思いますのは
/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
ありがとうございます
とりあえず、/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指定で誤りなどありますでしょうか
お手数ですがご指摘いただけましたらと思います
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
ありがとうございます
results[0]ですね。。
とりあえず的には、vars/delete_ldap_entry.ymlに
削除対象のldapエントリ属性を複数定義することで、複数のldapエントリを削除することは出来ます
エントリがないものは"rc": 32でfailedになるので
誤った属性指定していることの確認にもなるのでいいのかとも思ってもいますが。。。
jir01030様教示ありましたtask処理を試してみます
お伺いしておいてお力になれず申し訳ありませんでした・・