可以根据主机名值执行任务

ansible to perform a task based on hostname value

你好,我在下面试试。

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 没有主机名,所以有没有办法在 when 条件下使用实际主机的主机名?

甚至尝试过这个

   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"

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

你做得很好。该代码应该可以工作。为了测试字符串是否相等,通常使用“==”而不是包含“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