我使用以下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
添加自定义事实,还是有更好的方法?
答案 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 中的意思是“找不到对象”,这正是原始海报所追求的:“如果对象不存在,则创建它”