我发现通过通配符选择变量的唯一方法是循环所有变量并测试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 剧本/角色。假设我正在创建一个 ini 文件:
[drinks]
fav=lemonade
Run Code Online (Sandbox Code Playgroud)
在 Ansible 中有多种方法可以做到这一点,我将提到两种:
ini_file模块copy使用模块复制具有相同内容的文件哪种方法更可取?
谢谢。
我正在尝试从 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) 我正在尝试将一个字符串附加到 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) 我正在尝试调试“处理程序...在主处理程序列表和侦听处理程序列表中都找不到”问题。
有--list-host、--list-tags和--list-tags选项,但没有用于列出已注册处理程序的选项。我已经使用“调试”策略和 with 运行了 ansible-playbook -vvvv,但这些似乎都没有提供任何见解。我没有看到任何可能包含此信息的“神奇”变量。
有什么方法可以显示/转储这些处理程序和/或侦听器吗?
我可能错过了一些简单的东西。我在 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 }}"。
我基本上想用此任务的year1、year2、year3值填充{{ years }}。
我看过很多例子,但我看到的一切都太复杂了,而且是关于如何创建没有帮助的词典。
谢谢!
考虑到该剧将在本地或远程运行,我需要了解 ansible 的 remote_user 和 become_user 之间的区别。
之间的区别:
- hosts: all
become: yes
become_user: user1
- hosts: all
remote_user: user1
Run Code Online (Sandbox Code Playgroud)
如果在服务器之间设置了 ssh 密钥,会有什么区别吗?
我试图用谷歌搜索差异,但没有找到任何好的解释。
我想像这样在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但还有其他解决方案吗?
在 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)
然而这并没有奏效......
我正在尝试学习 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)