是否存在 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 中的意思是“找不到对象”,这正是原始发布者所追求的:“如果对象不存在,请创建它”
我使用以下 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 中的意思是“找不到对象”,这正是原始发布者所追求的:“如果对象不存在,请创建它”