我正在尝试使用Ansiblefacts来查找机器的架构。
\n我们可以通过运行命令来收集有关机器的信息ansible -m setup <host-name>,如文档中所述:发现变量:事实和魔术变量 \xe2\x80\x94 Ansible 文档。
但看起来 和ansible_architecture是ansible_machine相同的值。我不确定它们之间的区别。上述文档中的示例显示了以下两个具有相同值的值:
"ansible_architecture": "x86_64",\n "ansible_machine": "x86_64",\nRun Code Online (Sandbox Code Playgroud)\n在我的 M1 MacBook 上,结果是这样的:
\nshuuji3@momo mac-dev-playbook\n> ansible -m setup localhost | egrep \'_architecture|_machine\'\n "ansible_architecture": "arm64",\n "ansible_machine": "arm64",\nRun Code Online (Sandbox Code Playgroud)\n我们可以互换使用这些值吗?或者在另一种情况下它们可以有其他值吗?
\n我正在努力使Ansible与--limit一起工作并且这样做我需要关于其他主机的事实,我正在使用fact_caching进行缓存.我应该运行什么命令,以便它只是收集所有主机上的所有事实并缓存它们,而不运行任何任务?如果它缓存了它收集的事实,那么设置模块之类的东西将是完美的,但它似乎没有.
我想使用vars. 目前,我正在做如下
vars:
var1_name: "var1_value"
var2_name: "var2_value"
Run Code Online (Sandbox Code Playgroud)
由于变量的数量可以增加,我宁愿使用vars. 我已经构建了一个变量字典,如下所示
- name: set fact
hosts: localhost
tasks:
- set_fact:
variables: "{{ variables|default({}) | combine( {item.variable: item.value} ) }}"
with_items:
- variable: var1_name
value: "var1_value"
- variable: var2_name
value: "var2_name"
Run Code Online (Sandbox Code Playgroud)
字典看起来像这样:
"variables": {
"var1_name": "var1_value",
"var2_name": "var2_value",
}
Run Code Online (Sandbox Code Playgroud)
现在,我想让这个字典中的变量可用于在其他主机上执行的角色。
但是,当我试图通过字典来vars喜欢下面
vars: "{{ variables }}"
Run Code Online (Sandbox Code Playgroud)
Ansible 抛出错误:
ERROR! Vars in a Play must be specified as a dictionary, or a list of dictionaries
Run Code Online (Sandbox Code Playgroud)
如何传入字典变量vars?
因此,根据我收集的信息,我们可以使用 ansible.cfg 来设置 ansible 在运行剧本时查找的默认清单文件。
我们还可以在通过命令行运行 ansible playbook 时使用 -i 参数覆盖该清单。
有没有办法让我在不使用命令行或更改 ansible.cfg 文件的情况下在剧本中指定特定的特殊清单文件?
为了加快 Ansible playbook 的执行速度,我有时想在设置阶段禁用收集事实。这可以通过在剧本中添加以下内容来完成:
gather_facts: False
Run Code Online (Sandbox Code Playgroud)
但如何在命令行中控制呢?
我像这样执行我的 Ansible 剧本:
ansible-playbook playbook.yaml -i inventory.yaml
Run Code Online (Sandbox Code Playgroud) 当我们检查hostvars时:
- name: Display all variables/facts known for a host
debug: var=hostvars[inventory_hostname]
Run Code Online (Sandbox Code Playgroud)
我们得到:
ok: [default] => {
"hostvars[inventory_hostname]": {
"admin_email": "admin@surfer190.com",
"admin_user": "root",
"ansible_all_ipv4_addresses": [
"192.168.35.19",
"10.0.2.15"
],...
Run Code Online (Sandbox Code Playgroud)
我如何指定"ansible_all_ipv4_addresses"列表的第一个元素?
我在 Ansible 中使用 package_facts 模块时遇到问题。基本上,我只想安装 zabbix-agent 的版本,因为我需要根据安装的版本做一些事情。
现在我在剧本任务中得到了这个:
- name: Gather Installed Packages Facts
package_facts:
manager: "auto"
tags:
- zabbix-check
- name: "Zabbix Found test result"
debug: var=ansible_facts.packages['zabbix-agent']
when: "'zabbix-agent' in ansible_facts.packages"
tags:
- zabbix-check
- name: "Zabbix Not-found test result"
debug:
msg: "Zabbix NOT found"
when: "'zabbix-agent' not in ansible_facts.packages"
tags:
- zabbix-check
Run Code Online (Sandbox Code Playgroud)
它吐出这样的东西:
ok: [vm3] => {
"ansible_facts.packages['zabbix-agent']": [
{
"arch": "x86_64",
"epoch": null,
"name": "zabbix-agent",
"release": "1.el7",
"source": "rpm",
"version": "4.0.10"
]
}
ok: [vm4] => { …Run Code Online (Sandbox Code Playgroud) 如何传递相对路径,以便 Ansible 可以从node/keys服务器复制文件并将其复制到服务器?
剧本是ansible/playbook。
我的目录结构是:
??? ansible
? ??? inventory
? ??? playbook
??? node
? ??? keys
? ??? index.js
? ??? node_modules
? ??? package-lock.json
? ??? utils
??? shell
??? data.json
??? create-data.sh
??? destory.sh
??? firewall-rules.sh
Run Code Online (Sandbox Code Playgroud)
下面是剧本:
- hosts: all
vars:
source: "{{ source }}"
destination: /home/ubuntu
tasks:
- name: Copy files
copy:
src: "{{ source }}"
dest: "{{ destination }}"
Run Code Online (Sandbox Code Playgroud)
这就是我运行的方式:
ansible-playbook -i inventory/inventory.yaml playbook/crypto-generate.yaml
--extra-vars "source=../node/keys"
Run Code Online (Sandbox Code Playgroud)
我正在尝试传递相对路径。
我有一个 ansible 角色,如下所示:
\n\nmy-role\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 files\n\xe2\x94\x82 my-file-one\n\xe2\x94\x82 my-file-two\n\xe2\x94\x82 my-file-...\n\xe2\x94\x82 my-file-n\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 tasks\n main.yml\nRun Code Online (Sandbox Code Playgroud)\n\n在我的main.yml中,我有这个递归复制任务,\n并且我想复制所有文件,而不需要手动列出它们:
\n\n- name: copy all files\n copy:\n src: "{{ item }}"\n dest: /dest/\n with_items:\n - ????\nRun Code Online (Sandbox Code Playgroud)\n\n建议??
\n我正在尝试提取主要发行版版本(以ansible_facts字符串形式保存)并将其存储为整数以供以后使用<或>与整数进行比较。当我这样做时:
- set_fact:
distromajor: "{{ ansible_facts['distribution_major_version'] | int }}"
Run Code Online (Sandbox Code Playgroud)
我发现distromajorHold"7"而不是7.
所以后来比较失败。事实上,我让它发挥作用的唯一方法就是像这样进行比较:
(distromajor|int >=6) and (distromajor|int <= 8)
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
为什么我不能将发行版主要版本保存为 int?
最接近的SO问题没有解释为什么后来的整数比较失败而没有distromajor在比较时将变量重新转换为整数。