有条件地在主机上执行Ansible

时间:2018-10-01 20:03:54

标签: ansible

我试图在我的剧本中创建一个条件,该条件根据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,其中在单个剧本中将多个主机作为目标,但我不确定我的条件语法是否错误,或者我想完成什么根本做不到。我是否仅限于按角色定义条件?

我很高兴编辑这个问题,以使其更加清楚,因为它已经因为“不清楚”而被关闭...但是我不确定我还可以说多少,而不是确切说明我在上面问。如果有人愿意提供更具体的反馈,我很高兴。

3 个答案:

答案 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'