Ansible-基于主机名前缀定义设置

Ansible-基于主机名前缀定义设置,ansible,Ansible,我希望能够根据主机名的前缀在ansible playbook中设置值 e、 g.启动LondonXXXX的主机接收DNS的IP 192.168.1.1 启动NewYorkXXX的主机会收到DNS等的IP 192.168.2.1 我试过各种方法,但似乎都没能奏效。我通过以下方式引用剧本中的变量.yml: vars_files: - dns.yml 以下是我在DNS.yml文件中尝试过的几件事情的示例: --- - include: - name: Check if located

我希望能够根据主机名的前缀在ansible playbook中设置值

e、 g.启动LondonXXXX的主机接收DNS的IP 192.168.1.1 启动NewYorkXXX的主机会收到DNS等的IP 192.168.2.1

我试过各种方法,但似乎都没能奏效。我通过以下方式引用剧本中的变量.yml:

  vars_files:
    - dns.yml
以下是我在DNS.yml文件中尝试过的几件事情的示例:

---
- include:
  - name: Check if located in London
    set_fact: 
      DNS: '192.168.1.1'
    when: ansible_hostname.find("London") != -1

  - set_fact:
      DNS: '192.168.2.1'
    when: '"NewYork" in ansible_hostname'

我不熟悉使用ansible,因此如果这是一个简单的语法问题,我深表歉意。

vars文件只是名称:值对的集合。它不能有任务。在您发布的示例中似乎还存在一些语法错误,可能您使用的是一些实际上不存在的变量

如果你想使用像
set\u fact
这样的任务,那就需要在剧本中说明。例如,您可以这样做:

- hosts: all
  gather_facts: false
  tasks:
    - name: Check if located in London
      set_fact:
        DNS: '192.168.1.1'
      when: >
        "London" in inventory_hostname

    - set_fact:
        DNS: '192.168.2.1'
      when: >
        "NewYork" in inventory_hostname

    - debug:
        msg: "Variable DNS is: {{DNS}}"
London1234 ansible_host=localhost ansible_connection=local
NewYork1234 ansible_host=localhost ansible_connection=local
ansible-playbook playbook.yml -i hosts
给定一个如下所示的清单:

- hosts: all
  gather_facts: false
  tasks:
    - name: Check if located in London
      set_fact:
        DNS: '192.168.1.1'
      when: >
        "London" in inventory_hostname

    - set_fact:
        DNS: '192.168.2.1'
      when: >
        "NewYork" in inventory_hostname

    - debug:
        msg: "Variable DNS is: {{DNS}}"
London1234 ansible_host=localhost ansible_connection=local
NewYork1234 ansible_host=localhost ansible_connection=local
ansible-playbook playbook.yml -i hosts
我可以这样运行上面的剧本:

- hosts: all
  gather_facts: false
  tasks:
    - name: Check if located in London
      set_fact:
        DNS: '192.168.1.1'
      when: >
        "London" in inventory_hostname

    - set_fact:
        DNS: '192.168.2.1'
      when: >
        "NewYork" in inventory_hostname

    - debug:
        msg: "Variable DNS is: {{DNS}}"
London1234 ansible_host=localhost ansible_connection=local
NewYork1234 ansible_host=localhost ansible_connection=local
ansible-playbook playbook.yml -i hosts
并获得:

PLAY [all] *********************************************************************************

TASK [Check if located in London] **********************************************************
ok: [London1234]
skipping: [NewYork1234]

TASK [set_fact] ****************************************************************************
skipping: [London1234]
ok: [NewYork1234]

TASK [debug] *******************************************************************************
ok: [London1234] => {
    "msg": "Variable DNS is: 192.168.1.1"
}
ok: [NewYork1234] => {
    "msg": "Variable DNS is: 192.168.2.1"
}

PLAY RECAP *********************************************************************************
London1234                 : ok=2    changed=0    unreachable=0    failed=0   
NewYork1234                : ok=2    changed=0    unreachable=0    failed=0   

在我看来,在group_vars文件中使用该变量会更容易。然后,您的资源清册会将伦敦主机放入伦敦组,将纽约主机放入纽约组。

谢谢larsks,但我希望从配置文件中引用,而不是在剧本中对其进行配置。看起来我可能不得不以不同的方式管理hosts文件并使用group_varsSure,只是您的示例试图使用
set_fact
模块,该模块仅在剧本中有效。解决这个特殊问题绝对有其他方法。