ansible 如何从任务中的库存中获取主机

ansible 如何从任务中的库存中获取主机

我有两个库存,暂存和生产。
暂存内容:

[webserver]
192.168.56.101  #server 1
192.168.56.103  #server 2

生产内容:

[webserver]
192.168.56.108  #server test

我从服务器 1 中提取一个存档文件并希望将其传送到服务器测试然后解压。
我的 ansible 脚本如下:

- name: fetch archived file to local machine
  fetch:
    src: /tmp/code_release_version_{{ release_version }}.tar.gz
    dest: /tmp/code_release_version_{{ release_version }}.tar.gz
    flat: yes
  tags: test

- name: copy archived file to another remote server on /tmp directory
  copy:
    src: /tmp/code_release_version_{{ release_version }}.tar.gz
    dest: /tmp/code_release_version_{{ release_version }}.tar.gz
  delegate_to: 192.168.56.108
  tags: test

- name: extract files
  unarchive:
    src: /tmp/code_release_version_{{ release_version }}.tar.gz
    dest: /var/www
    copy: no
  delegate_to: 192.168.56.108
  tags: test

我玩:

ansible-playbook -i staging --extra-vars "host=webserver[0] user=emma release_version=1" --ask-sudo-pass playbook.yml --tags "test"

如何从库存中获取主机,而不是像我一样手动写入主机delegate_to: 192.168.56.108

先谢谢了。

答案1

我认为您不能对不同的服务器组使用相同的组名(无论是否在不同的环境中)。

运行剧本时,您正在使用一个环境的库存文件:

ansible-playbook -i staging ... --extra-vars "host=webserver[0]" playbook.yml 

相反,您可以尝试为此类任务设置第三个库存文件,其中包含所有服务器。

我猜你的 playbook.yml 是这样的:

hosts: "{{ host }}"
tasks:
- name: fetch archived file to local machine
  fetch:
...

- name: copy archived file to another remote server on /tmp directory
  copy:
..
  delegate_to: 192.168.56.108

因此,有一种解决方法是避免 delegate_to 使用所有包含的库存文件(我们将其命名为:all):

[webserverdev]
192.168.56.101  #server 1
192.168.56.103  #server 2

[webserverprod]
192.168.56.108  #server test

然后是如下的剧本:

hosts: webserverdev[0]
tasks:
- name: fetch archived file to local machine
  fetch:
...

hosts: webserverprod[0]
- name: copy archived file to another remote server on /tmp directory
  copy:
..

使用新库存运行剧本:

ansible-playbook -i all ... playbook.yml 

相关内容