是否存在 LDAP 数据库的 Ansible 测试?

Ansible test for existence of LDAP DB?

我使用以下 ansible 任务为 OpenLDAP 设置 MDB 数据库:

- name: set up MDB database
  shell: ldapadd -Y EXTERNAL -H ldapi:/// -f {{tmp_dir}}/mdb.ldif

但是,一旦设置了数据库,如果我再次 运行 剧本,我会收到错误消息:

<olcSuffix> namingContext "dc=test,dc=cluster" already served by a preceding mdb database

我显然需要添加一个 when 条件,以便只设置数据库,如果它不存在的话。但是,我不知道要测试什么。我应该根据 ldapsearch 添加自定义事实,还是有更好的方法?

正如 Bruce P 指出的那样,我应该回答我自己的问题以允许格式化:

我最终做了以下事情,这似乎对我的目的有用:

- name: test whether MDB database already exists 
  shell: ldapsearch -H ldap:// -x -s base -b "" -LLL "namingContexts" | grep -c "{{ ldap_suffix }}"
  register: is_db_setup
- name: set up MDB database
  shell: ldapadd -Y EXTERNAL -H ldapi:/// -f {{tmp_dir}}/mdb.ldif
  when: not is_db_setup.stdout 

实际上,通过 grep 传递搜索结果(请参阅我的其他答案)并不是一个好主意,因为如果找不到该字符串,则会生成一个错误,然后必须忽略。在when子句中使用字符串函数find似乎更优雅:

- name: test whether MDB database already exists
  shell: ldapsearch -H ldap:// -x -s base -b "" -LLL "namingContexts"
  register: naming_contexts
- name: set up MDB database
  shell: ldapadd -Y EXTERNAL -H ldapi:/// -f {{tmp_dir}}/mdb.ldif
  when: naming_contexts.stdout.find("{{ ldap_suffix }}") == -1

@loris 的初步回答帮助了我,但我相信更好的处理方法是查看 ldapsearch 返回的 rc 值,例如:

- name: test whether MDB database already exists
  shell: ldapsearch -H ldap:// -x -s base -b "" -LLL "namingContexts"
  register: naming_contexts
- name: set up MDB database
  shell: ldapadd -Y EXTERNAL -H ldapi:/// -f {{tmp_dir}}/mdb.ldif
  when: naming_contexts.rc == 32

在我的特殊情况下,我发现“ldap_suffix”也出现在标准输出中。 RC 32 在 ldap 中的意思是“找不到对象”,这正是原始发布者所追求的:“如果对象不存在,请创建它”