【问题标题】:How do I correctly use the ansible hostname module?如何正确使用 ansible 主机名模块?
【发布时间】:2019-11-14 14:27:40
【问题描述】:

我正在尝试使用 ansible 修改十几个新创建的虚拟机的主机名,但我无法理解如何正确循环。

这是我写的剧本:

---
- hosts: k8s_kvm_vms
  tasks:
  - name: "update hostnames"
    hostname:
      name: "{{ item }}"
    with_items:
      - centos01
      - centos02
      ...

结果是它使用每个主机名更新每个主机。所以如果我有 12 台机器,每个主机名在剧本的末尾都是“centos12”。

我希望这种行为基本上产生与以下相同的结果:

num=0
for ip in ${list_of_ips[*]}; do 
    ssh $ip hostnamectl set-hostname centos${num}
    num=$((num+1))
done

如果我自己用 bash 编写

The answer on this page 让我相信我必须在我的剧本中包含所有 IP 地址。在我看来,脚本的优势在于即使 IP 发生变化,我也可以拥有相同的主机名(我只需将 IP 地址复制到 /etc/ansible/hosts 中),我可以在其他剧本中重复使用这些主机名。我已经阅读了主机名模块上的 ansible 页面,但他们的示例让我相信我必须为每个单独的 IP 地址定义一个任务,而不是使用循环。如果是这种情况,为什么要在 bash 脚本上使用 ansible?

ansible hostname module

【问题讨论】:

  • 您能出示您的库存吗?您是否以 IP 命名机器?
  • 它确实像你的 bash 脚本一样工作。如果您通过 IP 或原始主机名(在您的清单中)循环并为您的清单中的新主机名设置一个变量。喜欢@Smily 的回答。

标签: bash ansible virtual-machine sysadmin


【解决方案1】:

您可以为清单中的每个服务器创建一个新变量,例如

[k8s_kvm_vms]
server1 new_hostname=centos1
server2 new_hostname=centos2

剧本:

---
- hosts: k8s_kvm_vms
  tasks:
  - name: "update hostnames"
    hostname:
      name: "{{ new_hostname }}"

【讨论】:

    【解决方案2】:

    我认为您需要 sudo 来更改主机名,因此您应该添加 "become: yes"

    ---
    - hosts: k8s_kvm_vms
      become: yes
      tasks:
      - name: "update hostnames"
        hostname:
          name: "{{ new_hostname }}"
    

    【讨论】:

    • OP 的脚本并不缺少 sudo 权限 - 主机名都以 'centos12' 结尾这一事实很清楚。
    • 不是答案。你错了。核心问题是 OP 重命名每个主机 12 次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多