我正在尝试通过使用 Ansible 生成 /etc/exports 文件来动态配置系统中的多个 NFS 服务器。我希望能够使用 jinja2 模板来做到这一点。这是 jinja2 模板,我无法根据我的导出列表找出它。
我在 nfs 角色中定义了以下变量:
site_nfs_servers: ['ansibletarget1', 'ansibletarget2']
exports:
- server: "ansibletarget1"
shares:
- path: "/my/first/share/path"
client: "*"
options: "rw,sync"
- path: "/my/second/share/path"
client: "*"
options: "rw,sync,root_squash"
- server: "ansibletarget2"
shares:
- path: "/another/shared/path/different/server"
client: "*"
options: "ro,sync"
Run Code Online (Sandbox Code Playgroud)
然后我有以下 ansible play 来生成模板:
- name: Generate the exports file.
template:
src: exports.j2
dest: /etc/exports
owner: root
group: root
mode: '0750'
Run Code Online (Sandbox Code Playgroud)
我的模板目前如下所示:
{% for export in exports %}
{% if ansible_hostname in export.server …
Run Code Online (Sandbox Code Playgroud) 我正在通过额外的变量启动 docker-compose 服务(apache solr)的安装手册。这些变量是在执行时设置的,因为该剧本应该是灵活的并且一台服务器上存在多种配置。
我的想法是,用户可以将 ansible ui (ansible 信号量)中的变量设置为字符串:
project_cores
main_en:english,main_de:german
我想将这些核心作为字典进行迭代。我最后想要的是:
{
{
name: main_en,
language: english
},
{
name: main_de,
language: german
},
}
Run Code Online (Sandbox Code Playgroud)
第一步是将它们分开,
(这已经有效):
- name: "debug: split cores"
debug:
msg: "{{ item }}"
loop: "{{ project_cores.split(',') }}"
Run Code Online (Sandbox Code Playgroud)
然后我尝试了以下操作但没有成功,因为这不会添加子元素的键:
- name: "Extract solr cores configuration."
set_fact:
dict: "{{ dict|default({}) | combine ( { item.split(':')[0] : item.split(':')[1] } ) }}"
with_items:
- "{{ project_cores.split(',') }}"
Run Code Online (Sandbox Code Playgroud)
我测试了一些组合,但没有找到有关如何添加键的有效解决方案。
知道如何将该字符串转换为第一个示例中所述的真实目录吗?提前致谢!
我有一个这样的字典列表:
list_of_dicts:
- name: Item1
- name: Item2
type: special
- name: Item3
- name: Item4
type: small
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,并非所有项目都有属性type
。上下文:如果没有type
设置属性,则表示该项目是默认类型。
我想选择所有不属于类型的项目special
。
我试过这个:list_of_dicts | rejectattr('type', 'equalto', 'special')
不幸的是,这会失败并出现AnsibleUndefinedVariable: 'dict object' has no attribute 'type'
错误,因为某些项目没有类型。
有什么好的方法可以解决这个问题呢?
我需要合并两个文件,其中没有重复的条目。有什么方法可以通过 ansible 模块实现它吗?例如,我有两个文件 /etc/hosts1 和 /etc/hosts2。我需要一个 /etc/hosts 文件,其中包含 /etc/hosts1 和 /etc/hosts2 中存在的所有条目,并且没有重复的条目。我怎样才能做到这一点。举个例子将不胜感激
- name: Merge two files
assemble:
src: /etc/hosts1
dest: /etc/hosts2
Run Code Online (Sandbox Code Playgroud)
上述汇编模块失败