Ansible - 否定过滤器

时间:2017-05-19 06:56:06

标签: filter ansible negate

我找到了一些带有find ansible模块的文件

- find:
    paths: "/"
    patterns: ["*.service"]
    file_type: file
    hidden: True
    recurse: yes
  register: find_results
  when: ansible_service_mgr == "systemd"

现在我想检查修改某些文件的权限:

- file:
    path: "{{ item.path }}"
    owner: root
    group: root
    mode: 0644
  with_items:
    - "{{ find_results.files }}"
  when:
    - item.path | match("/sys/devices/power/events/*")
    - ansible_service_mgr == "systemd"

问题在于我不想要比赛。我想要一切不符合这条道路的东西吗?

如何否定匹配过滤器? (!,不是,等等)?

3 个答案:

答案 0 :(得分:2)

感谢您的帮助,您也可以这样做:

not (item.path | match("/sys/devices/power/events/*"))

答案 1 :(得分:0)

我建议按如下方式重写您的任务:

export default class LoginScreen extends Component {

    constructor(props) {
        super(props);
        this.state = {
            username: '',
            password: ''
        };
    }
    login = () => {
        alert(this.state.username + " " + this.state.password);
    }
    render() {
        return (
            <View style={styles.container}>

                <Image source={require('../images/hulk.jpg')} style={styles.backgroundimage}>
                    <View style={styles.content}>
                        <Image source={require('../images/logo.png')} style={styles.logo}>
                        </Image>

                        <View style={styles.inputcontainer}>

                            <TextInput underLineColorAndroid='transparent' style={styles.input} value={this.state.username} onChangeText={(username) => this.setState({ username })} placeholderText='username' > </TextInput>

                            <TextInput secureTextEntry={true} underLineColorAndroid='transparent' style={styles.input} value={this.state.password} onChangeText={(password) => this.setState({ password })} placeholderText='password' placeholderTextColor='black'> </TextInput>

                        </View>
                        <TouchableOpacity onPress={this.login} style={styles.buttonContainer}>
                            <Text style={styles.buttonText}>LOGIN</Text>
                        </TouchableOpacity>
                    </View>
                </Image>
            </View>
        );
    }
}
  1. 它使用- file: path: "{{ item.path }}" owner: root group: root mode: 0644 with_items: "{{ [] if ansible_service_mgr != 'systemd' else find_results.files | rejectattr('path','match','/sys/devices/power/events/.*') | list }}" 拒绝(删除)rejectattr匹配find_results.files regexp的所有项目。一种你想要的比赛否定。

  2. 它仅对所需项目进行循环。您的任务将循环显示所有找到的文件,并为每个/sys/devices/power/events/.*语句未命中生成“已跳过”消息。

  3. 当托管的服务不是when时,它还会将空列表[]提供给with_items。否则,您的任务可能会为每个systemd项生成多个跳过的项,或者完全失败,因为之前的任务已被跳过并且find_results.files未定义。

  4. P.S。如果您有许多依赖于find_results.files的任务,您可能希望将它们分成不同的yaml文件并有条件地仅将其包含在systemd台计算机上 - 这将使代码更加清晰,如果没有这些systemd when: ansible_service_mgr == "systemd" }陈述。

答案 2 :(得分:0)

你可以尝试

吗?
when: ("/sys/devices/power/events/*" not in item.path "/sys/devices/power/events/")  and
      (ansible_service_mgr == "systemd")

但是第二个条件没用,因为你已经在获得find_results

时设置了条件