为幂等任务运行的Ansible角色添加条件

为幂等任务运行的Ansible角色添加条件,ansible,ansible-2.x,Ansible,Ansible 2.x,我已经搜索了相当长的一段时间,尝试了许多变体和类似的答案,但没有成功。希望这是我错过的一些简单的东西 表2.9.6 我正在创建许多剧本,它们都为我的客户共享一大套自定义角色。我想把所有的逻辑都排除在剧本之外,并将这些逻辑放在角色本身中,以允许最大程度的可重用性。基本上,我只想通过标签为简单的“角色”运行添加样板剧本,在这里和那里添加一些vars覆盖 我的问题是,我似乎不能通过使用条件使某些角色幂等——条件句不起作用。我得到的错误是: fatal: [localhost]: FAILED! =&g

我已经搜索了相当长的一段时间,尝试了许多变体和类似的答案,但没有成功。希望这是我错过的一些简单的东西

表2.9.6

我正在创建许多剧本,它们都为我的客户共享一大套自定义角色。我想把所有的逻辑都排除在剧本之外,并将这些逻辑放在角色本身中,以允许最大程度的可重用性。基本上,我只想通过标签为简单的“角色”运行添加样板剧本,在这里和那里添加一些vars覆盖

我的问题是,我似乎不能通过使用条件使某些角色幂等——条件句不起作用。我得到的错误是:

fatal: [localhost]: FAILED! => {"msg": "The conditional check 'homebrew_base.rc != 0' failed.
The error was: error while evaluating conditional (homebrew_bash.rc != 0): 'homebrew_bash' is undefined

The error appears to be in '/Users/eric/code/client1/provisioning/roles/bash/tasks/main.yaml': line 12, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: Change shell (chsh) for macOS to homebrew managed version
  ^ here
"}
下面是我的剧本的样板代码:

# ./playbook.yaml

---
- name: Provisioning
  hosts: localhost
  connection: local

  pre_tasks:
    - include_vars: "{{ item }}"
    with_fileglob:
      - "{{ playbook_dir }}/vars/global.yaml"
  tags: always

tasks:

  - name: Use homebrew bash binary
    include_role:
      name: bash
    tags: bash
上面的内容被截断了很多,但唯一缺少的是额外的var文件和一大堆
include\u角色

下面是我的角色文件。由于我不断遇到的错误,它们基本上没有经过测试

# ./roles/bash/tasks/main.yaml

---
- name: Check /etc/shells contains "/usr/local/bin/bash"
  command: grep -Fxq "/usr/local/bin/bash" /etc/shells
  register: homebrew_bash
  ignore_errors: True
  changed_when:
    - homebrew_bash.rc != 0

- name: Check that homebrew installed /usr/local/bin/bash
  stat:
    path: /usr/local/bin/bash
  register: homebrew_bash_binary

- name: Change shell (chsh) for macOS to homebrew managed versoin
  tags: bash, chsh
  shell: chsh -s /usr/local/bin/bash
  become: yes
  when:
    - homebrew_bash.rc != 0
    - homebrew_bash_binary.stat.exists = True
Ps:我确实计划将这些硬编码路径抽象为
角色/bash/defaults/
。但在那之前我需要它先工作

Ps2:如果有更好的方法使用包含过滤器(而不是
grep
hack),我洗耳恭听

我试过:

  • 创建单独的
    任务/chsh.yaml
    ,并使用
    include:
    命令在角色内调用该任务。当我这样做时,我得到一个奇怪的错误,告诉我变量未定义-在
    任务/chsh.yaml
    中-即使我正在
    任务/main.yaml
    中检查变量!这似乎不对
  • 在条件中的不同位置使用引号
  • 注释每个条件:两者都给出相同的错误,只是名称不同。
再一次,我试图在角色中保持这种逻辑,而不是在剧本中


谢谢

找到了答案。我错过了条件句上的“标签”

# ./roles/bash/tasks/main.yaml

---
- name: Check /etc/shells contains "/usr/local/bin/bash"
  tags: bash, chsh
  command: grep -Fxq "/usr/local/bin/bash" /etc/shells
  register: homebrew_bash
  ignore_errors: True
  changed_when:
    - homebrew_bash.rc != 0

- name: Check that homebrew installed /usr/local/bin/bash
  tags: bash, chsh
  stat:
    path: /usr/local/bin/bash
  register: homebrew_bash_binary

- name: Change shell (chsh) for macOS to homebrew managed versoin
  tags: bash, chsh
  shell: chsh -s /usr/local/bin/bash
  become: yes
  when:
    - homebrew_bash.rc != 0
    - homebrew_bash_binary.stat.exists = True