我正在尝试使用Ansible设置我的sshd_config文件.出于设计原因(我们有虚拟机和物理机,有不同的NIC)管理界面没有修复,所以在我的模板中我不能放
{{ ansible_eth0.ipv4.address }}
Run Code Online (Sandbox Code Playgroud)
因为我事先不知道哪个接口是管理接口所以我需要发现它.我知道IP总是在一个范围内(例如192.168.1.0/24).
如何发现哪个接口具有该IP,然后在模板中使用它?
使用 Ansible,我想将键值对存储在目标计算机上的文件中。
它将由单独的 Ansible 角色创建/更改,可能使用添加/删除等操作。我已经可以使用ansible-xml模块来实现此目的(但是,如果可以使用不同的格式进行以下操作,我不介意)。
是否有任何“Ansible”方法来获取远程 XML(或其他格式)文件的内容并将值填充到事实(变量)中?
我正在构建一些角色,我需要将配置指定组中所有主机的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 模板,我试图遍历一个主机组,并在我的模板中插入所有主机的 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 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) 团队,
我正在尝试验证 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 中数据操作的具体问题。
在我的清单文件中,我有一个名为 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
我想从 Ansible 中的变量中删除特定的子字符串并将结果存储到另一个变量中。假设我有如下内容:
greeting: "Hello_World"
我想从问候语中删除子字符串“_World”并将结果存储在另一个 Ansible 变量中。
例子:
greet_word: "Hello"
提前致谢!
如果我从头到尾运行一本剧本,它会收集事实,然后运行角色。但通常我不会这样做:我只是直接运行角色(通过他们的标签)。所以事实没有被收集,所以我得到了错误。为了解决这个问题,我必须记住运行一个特殊的“设置”任务:
$ 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% 保证在所有主机上收集?(对于这个用例,我不需要详尽的列表,只需几个,甚至一个。)
所以,这是设置。
我通过额外的变量将 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)
- 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)