对LDAP DB存在的Ansible测试?

时间:2016-01-05 11:08:19

标签: ansible openldap

我使用以下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添加自定义事实,还是有更好的方法?

3 个答案:

答案 0 :(得分:1)

正如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 

答案 1 :(得分:1)

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

- 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

答案 2 :(得分: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 中的意思是“找不到对象”,这正是原始海报所追求的:“如果对象不存在,则创建它”