![ansible 如何从任务中的库存中获取主机](https://linux22.com/image/669883/ansible%20%E5%A6%82%E4%BD%95%E4%BB%8E%E4%BB%BB%E5%8A%A1%E4%B8%AD%E7%9A%84%E5%BA%93%E5%AD%98%E4%B8%AD%E8%8E%B7%E5%8F%96%E4%B8%BB%E6%9C%BA.png)
我有两个库存,暂存和生产。
暂存内容:
[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