我有一个相当简单的剧本,可authorized_keys在Ansible中为给定的用户创建条目:
- name: chat user authorized keys
authorized_key:
user: chat
key: |
{% for filename in lookup('fileglob', 'public_keys/*.pub') %}
# {{ filename }}
{{ lookup('file', filename ) }}
{% endfor %}
exclusive: true
Run Code Online (Sandbox Code Playgroud)
我在该目录中大约有六个公钥文件。我正在尝试使用换行符分隔的所有键来格式化单个文件内容。
独家
是否从authorized_keys文件中删除所有其他未指定的密钥。可以通过换行符将多个键指定在单个键字符串值中。此选项不是循环感知的,因此,如果使用
with_,则它将在循环的每次迭代中独占,如果要在文件中包含多个键,则需要key如上所述将它们全部传递给一个批处理。
如何在这里使用fileglob将所有匹配的文件连接public_keys/*.pub到单个密钥中,以便我可以保持排他性并在必要时适当地删除密钥?
在过去的几个月里,我们一直在使用 Ansible 来部署我们的服务和配置文件,并且我们一直在使用 Ansible 变量。变量被放置在我们的 (config_name).yml.j2 文件中,这使我们可以轻松进行更改而无需对所有配置进行硬编码。
例如在 Ansibles group_vars 中,我们可能有:
metric_port_var: "9100"
并且 (config_name).yml.j2 将包含一行:
EXPOSE_METRIC_PORT={{ metric_port_var}}
当配置被部署时,盒子上的配置现在是:
EXPOSE_METRIC_PORT=9100
现在我们正在为 AlertManager/Prometheus 部署配置。出现的问题是 AlertManager 还在我们尝试部署的自己的配置文件中使用 jinja 模板变量。这些其他 jinja 模板将来自盒子上的其他配置文件。
这意味着我们的 (config_name).yml.j2 理论上将包含花括号变量的混合,其中一些可能属于 Ansible,而另一些将属于另一个文件。
由于在 group_vars 中找不到变量时抛出错误,我们不能再使用 Ansible 的“模板”模块来部署我们的配置,因为特定变量应该来自 AlertManager。
我们需要一种方法来混合 jinja 模板或转义一些花括号而不是其他花括号。现在我们回到硬编码我们的配置并让 AlertManager 使用所有变量。
我的大多数位置都有4个以上的DNS源,但有几个则更少。每个位置都有自己的dns4_ips列表变量,如下所示:
dns4_ips:
- dns_A
- dns_B
- dns_C
- dns_C
Run Code Online (Sandbox Code Playgroud)
我的resolv.conf模板如下所示:
domain example.com
search example.com dom2.example.com dom3.example.com
{% for nameserver in (dns4_ips|shuffle(seed=inventory_hostname)) %}
nameserver {{nameserver}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
Jinja for循环工作得很好,但是在我有大量名称服务器的情况下,我只希望列出shuffle()返回的前3个。
我想到了这一点:
nameserver {{ (dns4_ips|shuffle(seed=inventory_hostname))[0] }}
nameserver {{ (dns4_ips|shuffle(seed=inventory_hostname))[1] }}
nameserver {{ (dns4_ips|shuffle(seed=inventory_hostname))[2] }}
Run Code Online (Sandbox Code Playgroud)
...但是在某些情况下,我只有一个或两个DNS服务器可用,因此它们会产生错误的行或错误,对吗?
是否存在使用for循环处理此问题的干净方法,还是我需要在其中包装三个名称服务器行{% if (dns4_ips|shuffle(seed=inventory_hostname))[1] is defined %}?
我有yml带模板的文件。模板是从 yml 树中间开始的键的一部分。
模板工作没问题,但缩进只保存最后一个键。如何保存所有键的缩进?
base.yml:
app:
config1:
base: {{ service1.company.backend | to_nice_yaml(indent=2) }}
config2:
node: {{ service1.company.addr | to_nice_yaml(indent=2) }}
Run Code Online (Sandbox Code Playgroud)
config.yml:
service1:
company:
backend:
node1: "xxx"
node2: "yyy"
node3: "zzz"
addr:
street: ""
Run Code Online (Sandbox Code Playgroud)
我需要得到:
app:
config1:
base:
node1: "xxx"
node2: "yyy"
node3: "zzz"
config2:
node:
street: ""
Run Code Online (Sandbox Code Playgroud)
但真正的结果是:
app:
config1:
base:
node3: "zzz"
node1: "xxx"
node2: "yyy"
config2:
node:
street: ""
Run Code Online (Sandbox Code Playgroud)
node1并且node2不要保存缩进,Jinja2 解析器会获取最后一个节点。在下一步中,不正确的文件用于其他无法正确处理的角色。
在 Ansible 角色中,我使用 Jinja 模板创建一个从变量中获取值的文件。
vars 文件 vars/main.yml 的内容,从 jinja 模板中获取变量的位置:
Header:
- key: a-b-c
action: xxx
option: '"xyz 'ZZZ' abc.de *.abc.de"'
enabled: true
Run Code Online (Sandbox Code Playgroud)
Jinja 模板文件 templates/file.conf.j2 的内容:
{% for item in Header %}
{% if item.enabled is sameas true %}
Header {{ item.action }} {{ item.key }} {{ item.option }}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
调用模板模块的 tasks/main.yml 文件的内容:
- name: create server.conf
template:
src: file.conf.j2
dest: 'mydir/server.conf'
owner: root
group: root
mode: '0644'
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
The offending line appears …Run Code Online (Sandbox Code Playgroud) 团队,
我正在尝试验证 mount 命令输出中是否存在 sdd。因此,当有任何时,我很好,但是当没有时,我的任务只是失败,而不仅仅是告诉我不存在任何坐骑。任何提示如何解决这个问题?我不希望我的任务失败,而是报告状态。
当状态代码为 0 am 时很好,但当状态代码为 1 am 时只是看到失败,而不是一条有用的消息,即 mounds sdd 不存在。
"mount | grep sdd"
Run Code Online (Sandbox Code Playgroud)
- name: "Verify LVP Mounts sdd exists on CPU Nodes for mount_device"
shell: "mount | grep sdd"
register: lvp_mount
ignore_errors: yes
failed_when: False
delegate_to: "{{ item }}"
with_items: "{{ groups['kube-cpu-node'] }}"
- name: "Report status of mounts"
fail:
msg: |
Mounts sdd not found
Output of `mount | grep sdd`:
{{ lvp_mount.stdout }}
{{ lvp_mount.stderr }}
when: lvp_mount | failed
Run Code Online (Sandbox Code Playgroud)
输出: …
我有一个任务,该任务运行一个uri调用以获取包含YAML片段的JSON文件(从Rancher API获得)。我可以使用以下任务提取YAML片段
- name: generate_stack_call_body.yml read docker compose from catalog
set_fact:
docker_compose: '{{ template_detail|json_query(dc_query) }}'
Run Code Online (Sandbox Code Playgroud)
当我运行ansible调试策略时,表明我的docker_compose变量包含
(debug) p vars['docker_compose']
u"consul:\n labels:\n io.rancher.container.hostname_override: container_name\n io.rancher.container.pull_image: always\n io.rancher.container.hostname_override: container_name\n io.rancher.scheduler.global: 'true'\n stdin_open: true\n image: registry.mycompany.com/my-project/consul-rancher:0.9.0\n volumes:\n - /data/consul:/consul/data\nload-balancer:\n ports:\n - 8500:8500\n labels:\n io.rancher.container.hostname_override: container_name\n io.rancher.scheduler.global: 'true'\n stdin_open: true\n image: rancher/load-balancer-service\n links:\n
- consul:consul\n"
Run Code Online (Sandbox Code Playgroud)
在我看来,这是有效的YAML。
结果,我想应该可以将该值解释为有效的Ansible变量。
但是如何将其解释为变量?
以及以后如何将该变量放回字符串中?
我有一个 j2 文件,我想编辑并复制到我的远程服务器(作为我的 ansible play 的一部分)。该文件有几个用大括号表示的 3 个变量{{ }}。我怎样才能只定位命名的第二个变量{{ bar }}并忽略文件中的其他 2个变量,这样它们就可以单独存在并复制到我的远程服务器?例如,我的 test.j2 文件包含:
line 1 {{ foo }}
line 2 {{ bar }}
line 3 {{ foo2 }}
Run Code Online (Sandbox Code Playgroud)
{{ bar }}我可以在我的 ansible playbook 中明确处理变量吗?如果是这样,我将如何在我的 ansible playbook 中(在语法上)编写它?
我们如何使用 Ansible 嵌套变量进行通配符搜索?
YAML
test:
name:
address:
zipcode: 12345
Run Code Online (Sandbox Code Playgroud)
Ansible 模板变量
{{ test[name][addre*].zipcode }}
Run Code Online (Sandbox Code Playgroud) 我需要将以下 yaml 字典转换为逗号分隔的 key=value 对列表
nodes:
node1: 192.168.56.11
node2: 192.168.56.12
Run Code Online (Sandbox Code Playgroud)
所以它变成了
node1=192.168.56.11,node2=192.168.56.12
Run Code Online (Sandbox Code Playgroud)
在 Python 中,我会使用简单的列表理解来完成此操作,然后加入列表:
','.join([ k+'='+v for k,v in nodes.items()])
Run Code Online (Sandbox Code Playgroud)
不过,我不知道如何在 Ansible 模板中优雅地做到这一点。for当然,我可以用循环来做到这一点,但它会留下尾随逗号。迄今为止我最好的镜头:
{% for k,v in nodes.items() %}{{k}}={{v}}{% if not loop.last %},{% endif %}{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我是否忽略了什么?