标签: ansible-facts

发现管理IP并在模板中使用它

我正在尝试使用Ansible设置我的sshd_config文件.出于设计原因(我们有虚拟机和物理机,有不同的NIC)管理界面没有修复,所以在我的模板中我不能放

{{ ansible_eth0.ipv4.address }}
Run Code Online (Sandbox Code Playgroud)

因为我事先不知道哪个接口是管理接口所以我需要发现它.我知道IP总是在一个范围内(例如192.168.1.0/24).

如何发现哪个接口具有该IP,然后在模板中使用它?

ansible ansible-facts

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

Ansible:有没有办法从目标机器上的文件加载事实?

使用 Ansible,我想将键值对存储在目标计算机上的文件中。

它将由单独的 Ansible 角色创建/更改,可能使用添加/删除等操作。我已经可以使用ansible-xml模块来实现此目的(但是,如果可以使用不同的格式进行以下操作,我不介意)。

是否有任何“Ansible”方法来获取远程 XML(或其他格式)文件的内容并将值填充到事实(变量)中?

ansible ansible-facts

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

获取Jinja2过滤器组中主机的IP列表

我正在构建一些角色,我需要将配置指定组中所有主机的IP地址作为逗号分隔的字符串.

是否存在jinja2过滤器组合(如map,match,select,join等),它们产生如下:

{% set comma = joiner(",") %}
{% for hostname in groups['mongodb'] %}
{{ comma() }}{{ hostvars[hostname].ansible_default_ipv4.address }}
{%- endfor %}
Run Code Online (Sandbox Code Playgroud)

jinja2 ansible ansible-facts

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

当库存主机作为变量插入时无法访问主机变量

我有一个 jinja2 模板,我试图遍历一个主机组,并在我的模板中插入所有主机的 ipv4 地址。但是当我这样做时,我遇到了错误,即使我这样做的方式是每篇文章和文章都建议应该这样做的方式。

这是产生错误的模板:

{% if groups['linux-hosts'] %}
{% for item in groups['linux-hosts'] %}
define host {
    use                     generic-host-normal
    host_name               {{ item }}
    alias                   {{ item }}
    address                 {{ hostvars[item].ansible_default_ipv4.address }}
}
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

失败: [server] (item=servers.cfg) => {"changed": false, "item": "servers.cfg", "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars 对象'没有属性 'ansible_default_ipv4'"}

如果我不使用方括号中的变量“item”,而是从清单中指定特定主机,Ansible 就能够获取 ipv4 地址。示例(“服务器”是我库存中的主机名):

{{ hostvars['server'].ansible_default_ipv4.address }}
Run Code Online (Sandbox Code Playgroud)

ansible ansible-facts

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

如何使用 Ansible 收集有关磁盘的事实

我正在尝试编写一个 Ansible playbook,它将识别 RHEL 机器上新添加的磁盘。计划是在创建新磁盘之前运行剧本并在该时间点缓存磁盘作为事实。创建新磁盘后,将再次运行相同的 playbook,并计算创建磁盘前后磁盘的差异。

例如,lsblk最初返回以下内容:

NAME              SIZE  TYPE
sda               100G  disk
??sda1              1G  part
??sda2             99G  part
  ??rhel-root      50G  lvm
  ??rhel-swap     7.9G  lvm
  ??rhel-home    41.1G  lvm
sr0              1024M  rom

Run Code Online (Sandbox Code Playgroud)

添加 8 个新磁盘后,lsblk返回:

NAME              SIZE  TYPE
sda               100G  disk
??sda1              1G  part
??sda2             99G  part
  ??rhel-root      50G  lvm
  ??rhel-swap     7.9G  lvm
  ??rhel-home    41.1G  lvm
sdb              18.6G  disk
sdc              18.6G  disk
sdd              18.6G  disk
sde              18.6G  disk
sdf              18.6G  disk
sdg              18.6G  disk
sdh              18.6G  disk …
Run Code Online (Sandbox Code Playgroud)

ansible ansible-facts

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

ansible shell 任务在没有正确消息的情况下出错

团队,

我正在尝试验证 mount 命令输出中是否存在 sdd。因此,当有任何时,我很好,但是当没有时,我的任务只是失败,而不仅仅是告诉我不存在任何坐骑。任何提示如何解决这个问题?我不希望我的任务失败,而是报告状态。

当状态代码为 0 am 时很好,但当状态代码为 1 am 时只是看到失败,而不是一条有用的消息,即 mounds sdd 不存在。

 "mount | grep sdd"
Run Code Online (Sandbox Code Playgroud)
      - name: "Verify LVP Mounts sdd exists on CPU Nodes for mount_device"
        shell: "mount | grep sdd"
        register: lvp_mount
        ignore_errors: yes
        failed_when: False
        delegate_to: "{{ item }}"
        with_items: "{{ groups['kube-cpu-node'] }}"
      - name: "Report status of mounts"
        fail:
          msg: |
            Mounts sdd not found
            Output of `mount | grep sdd`:
            {{ lvp_mount.stdout }}
            {{ lvp_mount.stderr }}
        when: lvp_mount | failed
Run Code Online (Sandbox Code Playgroud)

输出: …

ansible ansible-template ansible-2.x ansible-facts

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

Ansible 如何根据某些属性选择主机并使用它们的 IP 地址在运行时创建列表

我有一个关于 ansible 中数据操作的具体问题。

在我的清单文件中,我有一个名为 postgresql 的组,如下所示:

[postgresql]
host1 ansible_host=1.1.1.1 postgresql_cluster_port=5432 postgresql_harole=master
host2 ansible_host=2.2.2.2 postgresql_cluster_port=5432 postgresql_harole=slave postgresql_master_ip=1.1.1.1
host3 ansible_host=3.3.3.3 postgresql_cluster_port=5432 postgresql_harole=slave postgresql_master_ip=1.1.1.1
host4 ansible_host=4.4.4.4 postgresql_cluster_port=5432 postgresql_harole=slave postgresql_master_ip=1.1.1.1
Run Code Online (Sandbox Code Playgroud)

在我的剧本中的某个地方,我需要操作和使用过滤器来创建 postgresql_harole=slave 的所有主机的 IP 地址列表,如下所示:

- hosts: postgresql
  gather_facts: True
  remote_user: root
  tasks:
    - set_facts:
        slave_ip_list: "{{ expressions }}"
Run Code Online (Sandbox Code Playgroud)

我正在拉扯我的头发以获得正确的表达...非常感谢任何帮助!!!!

jinja2 ansible ansible-facts ansible-inventory ansible-filter

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

从 Ansible 中的变量中提取子字符串

我想从 Ansible 中的变量中删除特定的子字符串并将结果存储到另一个变量中。假设我有如下内容:

greeting: "Hello_World"

我想从问候语中删除子字符串“_World”并将结果存储在另一个 Ansible 变量中。

例子: greet_word: "Hello"

提前致谢!

ansible ansible-facts

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

保证为所有主机收集 Ansible 事实

如果我从头到尾运行一本剧本,它会收集事实,然后运行角色。但通常我不会这样做:我只是直接运行角色(通过他们的标签)。所以事实没有被收集,所以我得到了错误。为了解决这个问题,我必须记住运行一个特殊的“设置”任务:

$ ansible-playbook playbook.yml -t setup,my-role
Run Code Online (Sandbox Code Playgroud)

我经常忘记这样做,出现错误并浪费时间。因此,我希望每个角色都从一个自动防止故障的任务开始,该任务会在必要时自动收集事实:

$ ansible-playbook playbook.yml -t setup,my-role
Run Code Online (Sandbox Code Playgroud)

这样可行。但在其他问题中,我读到并非所有的事实都是在所有主机上收集的 - 显然存在差异。

我选择了ansible_os_family,但我担心它不“通用”。

是否有任何事实可以100% 保证在所有主机上收集?(对于这个用例,我不需要详尽的列表,只需几个,甚至一个。)

ansible ansible-facts

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

Ansible:如何在 Ansible 中仅从 FQDN 获取 IP 地址?

所以,这是设置。

我通过额外的变量将 FQDN 列表传递给剧本,但控制机器的密钥与其对应的 IP 地址一起复制。此外,它们在清单中也没有特定的一组。

这个剧本的主机是一个服务器,它可能是也可能不是我通过额外变量传递的这个列表的一部分。因此,剧本没有任何关于这些节点的事实。

所以,我的问题是如何即时获取各个主机的 IP 地址,以便我可以遍历它们以对我之前通过另一个剧本/角色使用它们的 FQDN 设置的某些属性进行一些检查。(注意:我严格需要 FQDN 来设置这些属性)

我已经使用了 delegate_to 模块,并传递了 FQDN 并且它可以工作,但它询问我是否要继续连接(是/否)并等待用户输入以进行初始运行(如果给出是,它按预期工作)。他们还有其他更简单、更干净的方法来解决这个问题吗?
(注意:请记住,我无法修改库存的内容,例如放置别名等)

以下是代码片段:

- name: Checks
  become_user: hdfs
  shell: hdfs dfsadmin –report
  delegate_to: "{{ item.host_name }}"
  with_items:
    - "{{rackDetails}}"
Run Code Online (Sandbox Code Playgroud)

这是主 yml 文件的片段,其中调用了上述角色:

- name: Checks for the property
  hosts: servernode
  roles:
    - Checks
Run Code Online (Sandbox Code Playgroud)

库存代码片段如下所示:

[servernode]
10.0.2.15 ansible_ssh_user =授予ansible_ssh_pass =许可
[全部]
10.0.2.15 ansible_ssh_user =授予ansible_ssh_pass =授权
10.0.2.16 ansible_ssh_user =授权ansible_ssh_pass =授权
10.0.2.17 ansible_ssh_user =授权ansible_ssh_pass =授权
10.0.2.18 ansible_ssh_user =授权ansible_ssh_pass =授予
10.0.2.19 ansible_ssh_user=grant ansible_ssh_pass=grant

最后,这就是我通过额外变量传递的内容:

{"rackDetails":[{"host_name":"prod_node1.paas.com","rack_name":"/rack1"},{"host_name":"prod_node2.paas.com","rack_name":"/rack2"},{"host_name":"prod_node3.paas.com","rack_name":"/rack3"}]}
Run Code Online (Sandbox Code Playgroud)

ansible ansible-facts ansible-inventory

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