我试图在我的剧本中创建一个条件,该条件根据Dockerfile中定义的ENV
进行切换。该剧本由Dockerfile复制,并且Ansible针对localhost运行它来进行一些配置。但是,这些剧本也用于配置普通服务器。
这是我的问题:定义主机时可以使用条件吗?
- hosts: actual_server
roles:
- some_roles
when:
- DOCKER_CONTAINER is not defined
- hosts: docker_container
roles:
- almost_same_roles
when:
- DOCKER_CONTAINER is true
我搜寻了Ansible文档,发现了几个examples,其中在单个剧本中将多个主机作为目标,但我不确定我的条件语法是否错误,或者我想完成什么根本做不到。我是否仅限于按角色定义条件?
我很高兴编辑这个问题,以使其更加清楚,因为它已经因为“不清楚”而被关闭...但是我不确定我还可以说多少,而不是确切说明我在上面问。如果有人愿意提供更具体的反馈,我很高兴。
答案 0 :(得分:-1)
如果要在不同的环境中运行一个ansible脚本。
这是您的答案,您可以使用docker生成的每个环境的清单文件(如果需要)。
ansible-playbook playbook.yml -i development.ini
ansible-playbook playbook.yml -i testing.ini
ansible-playbook playbook.yml -i staging.ini
development.ini
[actual_server]
192.168.0.100 # some IP address
[docker_container]
127.0.0.1
testing.ini
[actual_server]
192.168.0.101 # some IP address
[docker_container]
127.0.0.1
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html https://symfonycasts.com/screencast/ansible/hosts-inventory
答案 1 :(得分:-1)
这不是理想的答案,但是您可以使用when
条件on each role:
- hosts: actual_server
roles:
- role: role1
when: DOCKER_CONTAINER is not defined
- role: role2
when: DOCKER_CONTAINER is not defined
...
- hosts: docker_container
roles:
- role: role3
when: DOCKER_CONTAINER is true
- role: role4
when: DOCKER_CONTAINER is true
...
答案 2 :(得分:-1)
老实说,应该将这种行为下放到任务中,而不是角色级别。角色描述了如何通过一系列任务来实现特定状态,任务本身执行步骤以实现特定状态。
话虽如此,在任务中具有确定是否执行的逻辑是有意义的。这意味着您的角色some_roles看起来像这样(警告:未经测试)。
# In tasks/playbook.yml
- hosts: actual_server
roles:
- some_roles
vars:
environment_type: Server
- hosts: docker_container
roles:
- some_roles
vars:
environment_type: Docker
# In vars/main.yml file
environment_type: Server
# In tasks/main.yml
- name: Download a tarball
get_url:
url: "https://example.com/some_package.tar.gz"
dest: /tmp
mode: 0750
when: environment_type == 'Docker'