我想在远程主机上的文件中包含变量,而不是运行Ansible的控制机器.
例如,我有一个文件/var/database_credentials.yml(在我的网络服务器上)
将变量从该文件添加到hostvars的最佳方法是什么,以便我可以在模板中使用它们?
include_vars模块仅从控制计算机获取文件.我可以使用fetch模块,但这似乎是一个不必要的步骤.
我正在尝试使用 F5 池查询的输出注册一个变量,但收到此错误:
"<type 'list'>": "VARIABLE IS NOT DEFINED!",
Run Code Online (Sandbox Code Playgroud)
我做错了什么?任何帮助表示赞赏。谢谢!
---
- name: GRAB F5 FACTS
hosts: f5
connection: local
gather_facts: no
tasks:
- name: Collect BIG-IP facts
bigip_device_facts:
gather_subset: ltm-pools
provider: "{{ prov }}"
register: bigip_device_facts
- name: FACTS OUTPUT
debug:
var: "{{ item.members | rejectattr('state', 'match', '^present$') | map(attribute='name') | list }}"
register: jkout
with_items: "{{ bigip_device_facts.ltm_pools }}"
when: item.full_path == "/Common/mypool"
- name: Set a variable
debug:
msg: "jkvar={{ jkout }}"
Run Code Online (Sandbox Code Playgroud) 我想获取 ansible 剧本中使用的变量列表。我研究了设置和调试模块,但我怀疑我能做到这一点。
有没有通用的方法?
基本上,我希望能够使用ansible在Linux中处理"通配符文件名".本质上,这意味着使用ls命令,其中部分文件名后跟"*",以便它仅列出某些文件.
但是,我无法将输出正确存储在变量中,因为可能会返回多个文件名.因此,我希望能够存储这些结果,无论一个任务期间阵列中可能有多少结果.然后,我希望能够在以后的任务中从数组中检索所有结果.此外,由于我不知道可能返回多少文件,因此我无法为每个文件名执行任务,并且数组更有意义.
这背后的原因是随机存储位置中的文件经常更改,但它们始终具有相同的上半部分.这是他们的名字的后半部分是随机的,我不想将其硬编码到ansible中.
我完全不确定如何在ansible中正确实现/操作数组,所以下面的代码是我"试图"完成的一个例子.显然,如果返回多个文件名,它将无法按预期运行,这就是我在此主题上寻求帮助的原因:
- hosts: <randomservername>
remote_user: remoteguy
become: yes
become_method: sudo
vars:
aaaa: b
tasks:
- name: Copy over all random file contents from directory on control node to target clients. This is to show how to manipulate wildcard filenames.
copy:
src: /opt/home/remoteguy/copyable-files/testdir/
dest: /tmp/
owner: remoteguy
mode: u=rwx,g=r,o=r
ignore_errors: yes
- name: Determine the current filenames and store in variable for later use, obviously for this exercise we know part of the filenames.
shell: "ls {{item}}"
changed_when: …Run Code Online (Sandbox Code Playgroud) 我遇到了一种情况,我试图从列表中删除该项目。但我没有得到预期的结果。请帮助我我在这里做错了什么?
这是清单:
"get_ec2_id.instances[0].tags": {
"Name": "test-db-system-2",
"aws:cloudformation:logical-id": "DBInstance",
"aws:cloudformation:stack-id": "arn:aws:cloudformation:us-east-1:123456789012:stack/test-db-system-2/0115v0a0-5d44-17e8-a024-503ama4a5qd1",
"aws:cloudformation:stack-name": "test-db-system-2",
"dbsystem:stack": "test-db-system-2",
"dbsystem:type": "db"
}
Run Code Online (Sandbox Code Playgroud)
}
我正在尝试使用以下过滤器从列表中删除所有“aws:cloudformation”标签:
"{{ get_ec2_id.instances[0].tags | reject('search','aws:') | list }}"
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
ok: [10.52.8.101] => {
"instances_tags": [
"dbsystem:type",
"dbsystem:stack",
"Name"
]
}
Run Code Online (Sandbox Code Playgroud)
但我预计结果如下:
"instances_tags": [
"dbsystem:stack": "test-db-system-2",
"dbsystem:type": "db"
"Name" : "test-db-system-2",
]
}
Run Code Online (Sandbox Code Playgroud)
帮我解决问题。
我正在收集可靠的事实。序列号有大写和小写两种形式。见下文。
5A2c32a-f1G85g-2035-0483-1fe9c129216d
Run Code Online (Sandbox Code Playgroud)
我需要将该事实与另一个完全小写的序列号进行比较。请参见下文。
5a2c32a-f1g85g-2035-0483-1fe9c129216d
Run Code Online (Sandbox Code Playgroud)
如果我使用 jinja2 过滤器转换为小写。然后我无法操作 json 输出。例如。我试过这个
- set_fact:
facts: "{{ facts | lower | to_json }}"
- debug:
var: facts.instance
Run Code Online (Sandbox Code Playgroud)
它抛出错误
TASK [play : set_fact] ******************************************************************************
ok: [localhost]
TASK [play : debug] ******************************************************************************
ok: [localhost] => {
"facts.instance": "VARIABLE IS NOT DEFINED!"
}
Run Code Online (Sandbox Code Playgroud)
但如果我facts只调试。它给了我输出。下面的作品,
- set_fact:
facts: "{{ facts | lower | to_json }}"
- debug:
var: facts
Run Code Online (Sandbox Code Playgroud)
但我需要获得更多的价值facts.instance.disk等
在 M1 MacBook 上,ansible_architecture和ansible_machine返回相同的值arm64:
shuuji3@momo mac-dev-playbook
> ansible -m setup localhost | egrep '_architecture|_machine'
"ansible_architecture": "arm64",
"ansible_machine": "arm64",
Run Code Online (Sandbox Code Playgroud)
在 M1 Mac 上的 Rosetta 2 仿真下怎么样?
---
- hosts: "{{ run_on_node|default('mysql_cluster_sql[0]')}}"
connection: "{% if migrated is defined and migrated == 'yes' %}local{% else %}ssh{% endif %}" # This works as we are assigning non boolean value
gather_facts: "{% if migrated is defined and migrated == 'yes' %}false{% else %}true{% endif %}" #This doesnt work well
tasks:
- debug: var=ansible_all_ipv4_addresses
- debug: var=ansible_default_ipv4.address
Run Code Online (Sandbox Code Playgroud)
库存文件:
[mysql_cluster_sql]
10.200.1.191 migrated=yes
Run Code Online (Sandbox Code Playgroud)
该变量根据条件具有 true 和 false 值,但即使 Gather_facts 为 false,它也会收集事实。
上下文:我的系统具有来自不同存储控制器的磁盘组合,因此每种类型的磁盘都有不同的用途。我是新手,可以边学边学。编写一本从每种类型的控制器获取磁盘的剧本,以便我进行设置。
例如 以下是#'filter = ansible_devices *'输出的示例... sdz设备来自SATA控制器。在我的其他主机上,它可能不一定总是sdz ..因此,如果设备具有“主机”:“ SATA控制器”,我想获取设备名称并存储在变量中。我在想,也许我需要遍历ansible_devices词典,找到匹配的密钥(“主机”:“ SATA控制器”),然后为其获取父字典,即该设备。有没有办法做到..或更简单的方法?:)
"sdz": {
"holders": [
"mpathz"
],
"host": "SATA controller: Intel Corporation C610/X99 series chipset 6-Port SATA Controller [AHCI mode] (rev 05)",
"links": {
"ids": [
"ata-SAMSUNG_MZ7GE960HMHP-00003_S1Y2NYAFC02269",
"wwn-0x50025388003aeb2a"
],
"labels": [],
"masters": [
"dm-19"
],
"uuids": []
},
"model": "SAMSUNG MZ7GE960",
"partitions": {},
"removable": "0",
"rotational": "0",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "cfq",
"sectors": "1875385008",
"sectorsize": "512",
"serial": "S1Y2NYAFC02269",
"size": "894.25 GB",
"support_discard": "512",
"vendor": "ATA",
"virtual": 1,
"wwn": "0x50025388003aeb2a"
Run Code Online (Sandbox Code Playgroud) ansible ×10
ansible-facts ×10
ansible-2.x ×1
apple-m1 ×1
arrays ×1
devops ×1
jinja2 ×1
jquery ×1
linux ×1
python ×1