【问题标题】:ansible get tag_Name and set hostname over multiple hostsansible 获取 tag_Name 并在多个主机上设置主机名
【发布时间】:2017-11-30 00:02:01
【问题描述】:
- hosts: ALL
gather_facts: true
remote_user:test
vars:
  Env: "{{ env }}"
tasks:
  - ec2_remote_facts:
    region: us-east-1
    aws_access_key: "{{ aws_access_key }}"
    aws_secret_key: "{{ aws_secret_key }}"
    filters:
     "tag:Env": "{{ env }}"
    register: instance_facts
  - name: group_hosts
    add_host: hostname={{ item }} groups=dev
    with_items: "{{ instance_facts.instances|map(attribute="private_ip_address)|list }}"
  - name: "loop over hosts for hostnames"
    hostname:
     name: {{ item }}
     with_items: "{{ instance_facts.instances|map(attribute=' ')|list }}"

我在本手册中的目的是获取 tag_Name 并在实例中设置为与主机名相同。我正在尝试不同的事情,但是在“为主机循环主机”任务中使用标签属性时卡住了。我如何提及 Tag = "Name" 以将其保存为主机名,因为它是一个嵌套属性?

【问题讨论】:

    标签: amazon-ec2 ansible jinja2


    【解决方案1】:

    你应该把你的剧本分成两个剧本:

    1. 生成内存清单
    2. 在主机上运行任务

    这是一个例子:

    - hosts: localhost
      gather_facts: no
      tasks:
        - ec2_remote_facts:
            region: us-east-1
            aws_access_key: "{{ aws_access_key }}"
            aws_secret_key: "{{ aws_secret_key }}"
            filters:
              "tag:Env": "{{ env }}"
            register: instance_facts
        - add_host:
            name: "{{ item.tags.Name }}"
            ansible_host: "{{ item.private_ip_address }}"
            group: dev
          with_items: "{{ instance_facts.instances }}"
    
    - hosts: dev
      gather_facts: true
      tasks:
        - hostname:
            name: {{ inventory_hostname }}
    

    【讨论】:

      【解决方案2】:

      我认为最好的方法是在用户数据中设置它。

      在 Linux 中:

      pip install awscli
      ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)
      REGION=$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//")
      NAME=$(aws ec2 describe-tags --filters "Name=resource-id,Values=$ID" --region $REGION --output=text | grep Name | awk '{ print $3 }')
      #set the hostname according your distro
      

      【讨论】:

      • userdata 仅在实例启动期间有效。这不就是理解吗?
      【解决方案3】:

      @Konstantin Suvorov 感谢这是一个很好的例子。 我将在“-add_host:”之后添加暂停,以便第二部分完成:

      - name: Let's wait for SSH to come up. Usually that takes ~10 seconds
            local_action: wait_for
              host={{ item.private_ip }}
              port=22
              state=started
            with_items: '{{ instance_facts.instances }}'
      

      【讨论】:

        猜你喜欢
        • 2019-06-09
        • 1970-01-01
        • 2015-12-05
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        • 2020-10-07
        相关资源
        最近更新 更多