小编Vla*_*tka的帖子

Ansible 变量通配符选择

我发现通过通配符选择变量的唯一方法是循环所有变量并测试match。例如

  tasks:
    - debug:
        var: item
      loop: "{{ query('dict', hostvars[inventory_hostname]) }}"
      when: item.key is match("^.*_python_.*$")
Run Code Online (Sandbox Code Playgroud)
shell> ansible-playbook test.yml | grep key:
    key: ansible_python_interpreter
    key: ansible_python_version
    key: ansible_selinux_python_present
Run Code Online (Sandbox Code Playgroud)
  • 有没有更有效的方法来做到这一点?

无论json_query([?键== '名']) ,也没有查找( '乏', '名')使用通配符的工作。

  • 是否还有其他“启用通配符”的测试、过滤器......?

注意:regex_search在 regex_search() 中与变量匹配的语法什么?

ansible

7
推荐指数
2
解决办法
4206
查看次数

Ansible 最佳实践 - 何时使用“ini_file”模块而不是“copy”

我努力寻找最佳实践或约定,使其更容易维护并让其他人阅读我的 Ansible 剧本/角色。假设我正在创建一个 ini 文件:

[drinks]
fav=lemonade
Run Code Online (Sandbox Code Playgroud)

在 Ansible 中有多种方法可以做到这一点,我将提到两种:

  1. 使用ini_file模块
  2. copy使用模块复制具有相同内容的文件

哪种方法更可取?

谢谢。

ansible

6
推荐指数
1
解决办法
3792
查看次数

Ansible:如何从列表字典中提取值

我正在尝试从 dict 列表中获取值,但无法获得所需的准确输出

使用安装了 ansible 2.7.5 和 jinja2 2.7.2 版本的 Linux 服务器。

下面是字典值的列表。

DOMAIN_GROUPS_ASSIGNMENT:


CACHE01:
    - domain_group: DG1
      is_active: true
    - domain_group: DG2
      is_active: true
    - domain_group: DG3
      is_active: true
  CACHE02:
    - domain_group: DG4
      is_active: true
    - domain_group: DG5
      is_active: true
    - domain_group: DG6
      is_active: true

  SCACHE01:
    - domain_group: DG1
      is_active: false
    - domain_group: DG2
      is_active: false
    - domain_group: DG3
      is_active: true
  SCACHE02:
    - domain_group: DG4
      is_active: false
    - domain_group: DG5
      is_active: false
    - domain_group: DG6
      is_active: false
Run Code Online (Sandbox Code Playgroud)

到目前为止尝试使用以下代码:

- …
Run Code Online (Sandbox Code Playgroud)

jinja2 ansible

5
推荐指数
1
解决办法
1万
查看次数

将字符串附加到 Ansible 中的列表

我正在尝试将一个字符串附加到 ansible 中的列表中,所以基本上我将构建一个有效负载来删除 F5 GTM 网络设备中的一些拓扑记录。

我能够创建一个列表,其中包含相应拓扑记录的所有输出。对于输出的每一行,我需要附加一个字符串“删除”。

- name: Lookup Topology Records  
  bigip_command:
    user: admin
    password: password
    server: gtm.abc.com
    commands: "list gtm topology | grep -i '{{ item }}'"
    warn: no
    validate_certs: no
  register: topology_info
  delegate_to: localhost
  loop: "{{ gtm_pool }}"
  
- debug: var=topology_info
 
- name: Sanitize the Topology records of the Pool
  set_fact:
    clean_topology_info: "{{ clean_topology_info | default ([]) + item.stdout_lines  }}"
  loop: "{{ topology_info.results }}"
  
- debug: var=clean_topology_info
 
 
- name: Sanitized Topology Info
  vars:
    topology_item: "{{ item }}" …
Run Code Online (Sandbox Code Playgroud)

ansible

5
推荐指数
1
解决办法
3万
查看次数

有没有办法在 Ansible 中显示已注册的处理程序或侦听器?

我正在尝试调试“处理程序...在主处理程序列表和侦听处理程序列表中都找不到”问题。

--list-host--list-tags--list-tags选项,但没有用于列出已注册处理程序的选项。我已经使用“调试”策略和 with 运行了 ansible-playbook -vvvv,但这些似乎都没有提供任何见解。我没有看到任何可能包含此信息的“神奇”变量。

有什么方法可以显示/转储这些处理程序和/或侦听器吗?

handler ansible

5
推荐指数
1
解决办法
1386
查看次数

Ansible 如何创建字典键列表

我可能错过了一些简单的东西。我在 vars.yml 中有字典

deploy_env:
  dev:
    schemas:
      year1:
        - main
        - custom
      year2:
        - main
        - custom
        - security
      year3:
        - main
        - custom
Run Code Online (Sandbox Code Playgroud)

然后在我的 playbook.yml 我有类似的东西

- set_fact:
    years: "{{ deploy_env.dev.schemas }}"

- name: Create schemas
  shell: "mysql ....params go here... {{ item }}"
  with_nested:
    - "{{ years }}"
Run Code Online (Sandbox Code Playgroud)

如果vars.yml中的模式是一个简单的列表,则上述工作正常,即:

...schemas:
     - year1
     - year2
     - year3
Run Code Online (Sandbox Code Playgroud)

但是,一旦我在每年下添加其他项目(使其成为字典(?),我就开始在线上出现错误:- "{{ years }}"

我基本上想用此任务的year1year2year3值填充{{ years }}

我看过很多例子,但我看到的一切都太复杂了,而且是关于如何创建没有帮助的词典。

谢谢!

variables dictionary nested-lists ansible

5
推荐指数
1
解决办法
8400
查看次数

ansible 的 remote_user 和 become_user 有什么区别

考虑到该剧将在本地或远程运行,我需要了解 ansible 的 remote_user 和 become_user 之间的区别。

之间的区别:

- hosts: all
  become: yes
  become_user: user1

- hosts: all
  remote_user: user1
Run Code Online (Sandbox Code Playgroud)

如果在服务器之间设置了 ssh 密钥,会有什么区别吗?

我试图用谷歌搜索差异,但没有找到任何好的解释。

privileges elevated-privileges ansible

4
推荐指数
2
解决办法
3696
查看次数

如何在ansible中将字典格式化为字符串

我想像这样在ansible中格式化一个字典,

{'a': 1, 'b': 2, 'c': 3}
Run Code Online (Sandbox Code Playgroud)

'a=1,b=2,c=3'
Run Code Online (Sandbox Code Playgroud)

并且必须将其设置为块中的环境变量,如下所示,

vars:
  test_env:
    a: 1
    b: 2
    c: 3

- block:
    # tasks
  environment:
    SOME_ENV: 'a=1,b=2,c=3'
Run Code Online (Sandbox Code Playgroud)

这里我想将test_envdict 转换为'a=1,b=2,c=3' 我无法设置事实来修改 dict 然后将其设置为SOME_ENV因为environment是一个不同的子句,也许我可以修改子句中的 dictvars但还有其他解决方案吗?

jinja2 ansible

3
推荐指数
1
解决办法
9233
查看次数

如何计算与 Ansible 中的条件匹配的哈希中某个对象的出现次数?

在 ansible 变量中给出这个列表:

---
hosts:
- address: host1.local
  cluster:
    name: RED
- address: host2.local
  cluster:
    name: RED
- address: host3.local
  cluster:
    name: GREEN
- address: host4.local
  cluster:
    name: BLUE
Run Code Online (Sandbox Code Playgroud)

我现在想以某种方式计算每个集群中的主机数量。所以我想结束:

hosts_per_cluster:
   RED: 2
   BLUE: 1
   GREEN: 1
Run Code Online (Sandbox Code Playgroud)

人们会怎样做呢?

我的第一次尝试是这样的:

- name: Get number of hosts per cluster
      set_fact: 
        hosts_per_cluster[item.cluster.name]={{ hosts_per_cluster[item.cluster.name] | default(0) | int +1 }}
      loop: "{{ hosts }}"
Run Code Online (Sandbox Code Playgroud)

然而这并没有奏效......

jinja2 ansible

3
推荐指数
1
解决办法
509
查看次数

使用 jinja 的 Ansible set_fact 列表

我正在尝试学习 jinja 和 Ansible。这是在 RHEL 7.9 上,

ansible 2.9.27
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, May 27 2022, 11:27:32) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
Run Code Online (Sandbox Code Playgroud)

我进行此练习的唯一原因是学习。但我很困惑。为什么这不产生一个列表found_route_list(这是一个列表)?

ansible 2.9.27
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, May 27 2022, 11:27:32) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
Run Code Online (Sandbox Code Playgroud)

我的剧本首先收集服务器上的路由:

- name: Get route info
  shell: /usr/sbin/ip route show | sed -e 's/ proto.*//' 
  register: …
Run Code Online (Sandbox Code Playgroud)

jinja2 ansible

2
推荐指数
1
解决办法
3057
查看次数