我想写一个Python程序,它使用Ansible给我的事实ansible HOST -m setup.
当我调用它时,我得到一个响应,使它只有几乎纯粹的JSON:
$ ansible localhost -m setup
localhost | success >> {
// actual data
}
Run Code Online (Sandbox Code Playgroud)
有没有办法直接获得这个JSON响应而不解析shell输出(可能不太稳定)?我甚至可以直接在Python 3程序中使用Ansible吗?
我想将 IP 地址插入到 Ansible playbook 使用的 J2 模板中。该 IP 地址不是正在配置的主机的地址,而是完成配置的主机的 IP。到目前为止,我发现的所有内容都涵盖了使用与所配置的主机相关的变量/事实。\n换句话说:I\xe2\x80\x99d 喜欢插入的 IP 是[\'ansible_default_ipv4\'][\'address\']执行ansible -m setup 127.0.0.1.
我认为我可以使用本地剧本编写一个包含 IP 的动态生成的模板文件,但我希望这可能是 \xe2\x80\x9cAnsible 方式\xe2\x80\x9d。
\n是否可以使用ansible_factsAnsible adhoc命令中通常包含的内容?
例如,我/tmp/myFile所有服务器上都有一个文件,我想这样做:
ansible all -i [inventory file] -m fetch -a "src=/tmp/myFile dest=myFile-[insert ansible_hostname here]"
Run Code Online (Sandbox Code Playgroud)
无需为此编写一本完整的剧本。
我正在使用Ansible:2.2.0.0
两个无聊的盒子(一个CentOS 7.x和一个Ubuntu 14.04)和
第三个盒子是EC2 Amazon Linux实例(Amazon Linux AMI版本2016.03)。
在这些框中,我正在运行以下命令并获得有效的输出(如下所示):
CentOS的:
[vagrant@myvagrant ~] $ ansible all -m setup -i "`hostname`," --connection=local -a "filter=ansible_distribution*"
myvagrant | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "CentOS",
"ansible_distribution_major_version": "7",
"ansible_distribution_release": "Core",
"ansible_distribution_version": "7.2.1511"
},
"changed": false
}
Run Code Online (Sandbox Code Playgroud)
Ubuntu的:
vagrant@myubuntuvagrant:~$ ansible all -m setup -i "`hostname`," --connection=local -a "filter=ansible_distribution*"
myubuntuvagrant | SUCCESS => {
"ansible_facts": {
"ansible_distribution": "Ubuntu",
"ansible_distribution_major_version": "14",
"ansible_distribution_release": "trusty",
"ansible_distribution_version": "14.04"
},
"changed": false
}
vagrant@myubuntuvagrant:~$
Run Code Online (Sandbox Code Playgroud)
Amazon …
yum amazon-ec2 amazon-web-services ansible-2.x ansible-facts
我正在运行YAML文件中定义的多个ansible播放。
在上一部游戏中,出现以下错误:
{"failed": true, "msg": "The conditional check 'ansible_os_family == \"RedHat\"' failed. The error was: error while evaluating conditional (ansible_os_family == \"RedHat\"): 'ansible_os_family' is undefined\n
Run Code Online (Sandbox Code Playgroud)
我是否需要通过收集事实或其中的某些内容来进行任何更改ansible.cfg?
我有一个复杂的环境,有多个系统的阶段和用户.
阶段是:dev,int等.
每个阶段都有一个应用程序用户,让我们调用用户john.这导致dev和johni的用户johnd为int等等.
为了抽象系统管理,由于阶段中的所有系统都是相同的,我创建了这个数据结构:
users:
john:
dev:
name: "johnd"
int:
name: "johni"
Run Code Online (Sandbox Code Playgroud)
现在我有一个角色"collect_user_information",它从LDAP收集所有类型的信息,并在set_fact的帮助下将它们存储在变量中.
- name: Get the userhome out of LDAP
shell: 'getent passwd {{ users[ user ][ stage ].name }} | cut -d: -f6'
register: user_home
Run Code Online (Sandbox Code Playgroud)
和set_fact:
- name: set facts for LDAP user
set_fact:
"{{user}}":
name: "{{ users[ user ][ stage ].name }}"
home: "{{ user_home.stdout }}"
Run Code Online (Sandbox Code Playgroud)
要转储变量,我使用:
- name: debug output for myuser
debug: var="{{user}}"
Run Code Online (Sandbox Code Playgroud)
调试输出看起来很有意思.
TASK [collect_user_information : debug output for user] *******
ok: [host1] => …Run Code Online (Sandbox Code Playgroud) 我有一个包含localhost角色和远程主机角色的playbook.
在其中一个localhost角色中,我设置了一个名为的事实git_tag.
我想在远程主机的模板中使用这个事实.
我试过了:
- name: Read Version
set_fact:
git_tag: "{{ package_json.stdout | from_json | json_query('version')}}"
delegate_to: "test-server"
Run Code Online (Sandbox Code Playgroud)
但是当Ansible达到了读取模板的角色时,{{ git_tag }}它会说出来git_tag is undefined.
我确定我做错了什么.我该怎么做?
上下文:我的系统具有来自不同存储控制器的磁盘组合,因此每种类型的磁盘都有不同的用途。我是新手,可以边学边学。编写一本从每种类型的控制器获取磁盘的剧本,以便我进行设置。
例如 以下是#'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 有一个名为ansible_play_hosts的变量,它是正在执行特定操作的所有主机的列表。我想要包含所有这些主机的实际组名称。
我使用的是ansible版本2.3.2.0
例子:
# file: hosts
[my-host-group]
hostname-1
hostname-2
Run Code Online (Sandbox Code Playgroud)
# file: playbook.yml
---
- hosts: my-host-group
tasks:
- name: "Print group name for 'hosts'"
debug:
msg: "Hosts var is '{{ hosts }}'"
Run Code Online (Sandbox Code Playgroud)
我想要打印该消息Hosts var is 'my-host-group'
我试图将一个事实从host1传递到host2,但是当ansible到达hosts2时,它返回“未定义的变量”:
- name: some playbook
gather_facts: false
hosts: host1
tasks:
- set_fact:
fact1: "foo"
- hosts: host2
gather_facts: false
tasks:
- debug:
msg: "{{ fact1 }}"
Run Code Online (Sandbox Code Playgroud)