【问题标题】:ansible to perform a task based on hostname value可以根据主机名值执行任务
【发布时间】:2021-07-01 15:30:39
【问题描述】:

嗨,我在下面试试。

task:
 - name: Perform on primary server
   blockinfile:
    path: '/home/conf'
    marker: "#-- {mark} Adding Values --"
    block: |
      {{ conf }}
   when: "'host01' in inventory_hostname" 

 - name: Perform on stdby server
   blockinfile:
    path: '/home/conf'
    marker: "#-- {mark} Adding Values --"
    block: |
      {{ conf_stdby }}
   when: "'host02' in inventory_hostname"

由于每个任务都在所有主机上同时执行,我希望它会在第一个任务中更改 host01,并在第二个任务中跳过 host02,反之亦然,但是它在两个任务中的两个主机中都发生了变化,当我检查服务器都有conf_stdby

此外,我的剧本中还有许多其他主机共有的任务。

inventory_hostname 不起作用,因为在 playbook 的清单文件中没有 ip 没有主机名,所以有没有办法在什么情况下使用实际主机的主机名?

也试过了

   vars:
     my_conf:
       host01: "{{ conf }}"
       host02: "{{ conf_stdby }}"
   task:
     - name: Perform on primary server
       blockinfile:
        path: '/home/conf'
        marker: "#-- {mark} Adding Values --"
        block: |
          {{ conf }}
       when: ""{{hostvars[inventory_hostname].ansible_hostname}} in myconf"

两个主机仍然添加相同的块

【问题讨论】:

  • 还有其他(也是更好的)方法可以解决您的问题,但要坚持您原来的问题“基于主机名执行任务”,这里有一个更好的方法:gist.github.com/zeitounator/2c61c1834e4700ab70ecf609244dbd57
  • 感谢@Zeitounator 的回复,我的剧本中有很多常见的任务,所以你提到的链接不能解决目的,我还编辑了我的问题以更新这个细节

标签: ansible ansible-2.x


【解决方案1】:

你做得很好。代码应该可以工作。为了测试字符串是否相等,通常使用“==”而不是包含“in”。但是,您可以引用字典中的配置数据并简化代码,例如

vars:
  my_conf:
    host01: "{{ conf }}"
    host02: "{{ conf_stdby }}"
task:
  - blockinfile:
      path: /home/conf
      marker: "#-- {mark} Adding Values --"
      block: |
        {{ my_conf[inventory_hostname] }}
    when: "inventory_hostname in my_conf"

问:"库存中没有主机名,只有ip。"

A:无论您在库存中获得什么,都将其放入字典中。 YAML 字典中的键没有限制,例如库存

shell> cat hosts
10.1.0.61
10.1.0.62

和剧本

shell> cat playbook.yml
- hosts: all
  gather_facts: false
  vars:
    my_conf:
      10.1.0.61: conf
      10.1.0.62: conf_sdtdby
  tasks:
    - debug:
        msg: "{{ my_conf[inventory_hostname] }}"

给予

ok: [10.1.0.61] => 
  msg: conf
ok: [10.1.0.62] => 
  msg: conf_sdtdby

【讨论】:

  • 感谢@Vladimir 的回复,我试过了,它失败并出现以下错误,这很奇怪,为什么它得到主机名{ "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute u'10.x.x.x'\n\n *****, "_ansible_no_log": false }的ip
  • 它会获取您放入库存的内容。 edit 你的问题并提出minimal reproducible example
  • 我的坏@Vladimir,我意识到库存中没有主机名,只有ip,所以我不认为我可以使用这个神奇的变量inventory_hostname 你知道我们如何使用主机的实际主机名吗在什么时候?
  • 我已经更新了答案。如果您有更多问题,请打开一个新问题并将其发送到minimal reproducible example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多