如何在没有指定主机的情况下运行 Ansible playbook?

问题描述 投票:0回答:2

我正在编写一个剧本,它可以启动 X 个 EC2 AWS 实例,然后在它们上安装一些软件(apt 包和 pip 模块)。当我运行 playbook 时,它会在本地系统上执行 shell 命令,因为除非我指定主机并输入 localhost,否则 Ansible 不会运行。

在剧本中,我尝试在顶层指定“hosts: all”,但这只会使剧本运行一秒钟而不执行任何操作。

playbook.yml

- name: Spin up spot instances
  hosts: localhost
  connection: local
  vars_files: ansible-vars.yml
  tasks:
    - name: create {{ spot_count }} spot instances with spot_price of ${{ spot_price }}      
      local_action:
        module: ec2
        region: us-east-2
        spot_price:  '{{ spot_price }}'
        spot_wait_timeout: 180
        keypair: My-keypair
        instance_type: t3a.nano
        image: ami-0f65671a86f061fcd
        group: Allow from Home
        instance_initiated_shutdown_behavior: terminate
        wait: yes
        count:  '{{ spot_count }}'
      register: ec2

    - name: Wait for the instances to boot by checking the ssh port
      wait_for: host={{item.public_ip}} port=22 delay=15 timeout=300 state=started
      with_items: "{{ ec2.instances }}"

    - name: test whoami
      args:
        executable: /bin/bash
      shell: whoami
      with_items: "{{ ec2.instances }}"

    - name: Update apt
      args:
        executable: /bin/bash
      shell: apt update
      become: yes
      with_items: "{{ ec2.instances }}"

    - name: Install Python and Pip
      args:
        executable: /bin/bash
      shell: apt install python3 python3-pip -y        
      become: yes
      with_items: "{{ ec2.instances }}"

    - name: Install Python modules
      args:
        executable: /bin/bash
      shell: pip3 install bs4 requests
      with_items: "{{ ec2.instances }}"

ansible-vars.yml

ansible_ssh_private_key_file: ~/.ssh/my-keypair.pem
spot_count: 1
spot_price: '0.002'
remote_user: ubuntu

EC2 实例创建得很好,并且“等待 SSH”任务有效,但 shell 任务在我的本地系统而不是远程主机上运行。

我如何告诉 Ansible 在不使用主机文件的情况下连接到 EC2 实例,因为我们是动态创建它们的?

ansible
2个回答
0
投票

如果有效的话你可以尝试一下吗?

- name: test whoami
      args:
        executable: /bin/bash
      shell: whoami
      delegate_to: "{{ item }}"
      with_items: "{{ ec2.instances }}"

0
投票

在我的设置中,我使用

connection: local
创建实例,然后将每个实例添加为我的清单中的主机。这种方法允许 Ansible 在配置阶段针对
localhost
运行,但我仍然可以管理主机库存。例如,在配置 EC2 实例时,我在本地执行任务,同时跟踪清单文件中的每个实例。

创建实例后,您可以使用

add_host
模块将它们动态添加到 playbook 中的新组中。这样,在接下来的操作中,Ansible 可以直接连接到 EC2 实例。以下是如何做到这一点的示例:

- name: Provision EC2 instances
  hosts: localhost
  connection: local
  tasks:
    - name: Create EC2 instance
      ec2:
        key_name: "{{ keypair }}"
        instance_type: t2.micro
        image: ami-123456
        region: us-west-1
        wait: yes
      register: ec2_info

    - name: Add new EC2 instance to the inventory
      add_host:
        name: "{{ item.public_dns_name }}"
        groups: ec2_instances
      loop: "{{ ec2_info.instances }}"

- name: Configure EC2 instances
  hosts: ec2_instances
  tasks:
    - name: Ensure EC2 instance is accessible
      ping:
      
    - name: Install nginx
      yum:
        name: nginx
        state: present

在此示例中,我们首先使用

ec2
模块配置 EC2 实例,然后使用
add_host
将每个实例添加到名为
ec2_instances
的组中。在第二个场景中,Ansible 连接到这些实例并运行安装 nginx 等任务。

请记住,您需要一种安全的方式来向 Ansible 提供用于访问 EC2 实例的 SSH 私钥。您可以在 playbook 中显式传递密钥,也可以在 Ansible

ansible.cfg
文件或环境变量中配置它。例如,您可以这样定义:

[ec2_instances]
ansible_ssh_private_key_file=/path/to/private/key.pem

这样,Ansible 就可以访问和管理新创建的 EC2 实例。

© www.soinside.com 2019 - 2024. All rights reserved.