有条件地在主机上执行,Ansible

有条件地在主机上执行,Ansible,ansible,Ansible,我试图在我的剧本中创建一个条件,该条件根据Dockerfile中定义的ENV进行切换。Dockerfile复制剧本,Ansible在本地主机上运行剧本进行一些配置。但是,这些剧本也用于配置普通服务器 我的问题是:在定义主机时是否可以使用条件语句 - hosts: actual_server roles: - some_roles when: - DOCKER_CONTAINER is not defined - hosts: docker_container role

我试图在我的剧本中创建一个条件,该条件根据Dockerfile中定义的
ENV
进行切换。Dockerfile复制剧本,Ansible在本地主机上运行剧本进行一些配置。但是,这些剧本也用于配置普通服务器

我的问题是:在定义主机时是否可以使用条件语句

- 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文档,发现在一个playbook中有多个主机是目标主机,但我不确定我的条件语法是否错误,或者我想完成的事情是否根本无法完成。我是否仅限于在逐个角色的基础上定义条件


我很高兴编辑这个问题,让它更清楚,因为它已经因为“不清楚”而关闭。。。但我不确定我能说得清楚多少,而不是在上面确切地说明我在问什么。如果有人愿意提供更具体的反馈,我很高兴。

如果您想为不同的环境运行一个ansible脚本

这是您的答案,您可以使用docker生成的每个环境的清单文件(如果需要)

发展网

[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

不是理想的答案,但在以下情况下,您可以使用


老实说,这种行为应该放在任务中的较低位置,而不是角色级别。角色描述如何通过任务列表完成特定状态,任务本身执行步骤以完成该特定状态

话虽如此,在任务中使用逻辑来确定它是否将执行是有意义的。这意味着您的角色某些_角色将如下所示(警告:未测试)


不太了解你的问题。您想对不在docker中的主机运行一些角色,而对docker中的主机运行其他角色?@devDev-据我所知,您可以为任务执行设置“何时”条件,而不是选择角色。@Jack完全正确。我希望使用相同的脚本来检测名为DOCKER_CONTAINER的环境变量,并将其设置为true/false,然后根据该变量设置的内容执行一批角色。@shangan感谢您的提醒。我开始觉得情况就是这样。你下面的答案是我在问之前降落的地方。Ansible的设计似乎是为了在清单文件中处理我想从剧本中获得的功能。@devdevdev是的,清单应该将docker主机和非docker主机分组。然后让您的剧本在
主机:
行中指定组。谢谢。这是准确的,但我试图避免它。不过,这或@shangan的清单文件解决方案可能是可行的。如果您将主机正确分组,为什么需要
when:
选项?我明白您在这里的意思。什么时候对角色使用条件比较合适?@devdevdev:你不能简单地将角色作为剧本的一部分导入,因此在那里看到条件对我来说似乎很尴尬。这是有道理的。谢谢你的洞察力。这是我最后的答案,加上上面的@shangan。
[actual_server]
192.168.0.101 # some IP address

[docker_container]
127.0.0.1
- 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
      ...
# 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'