Module lineinfile模块与Ansible变量字典的作用不正确

Module lineinfile模块与Ansible变量字典的作用不正确,module,ansible,Module,Ansible,我的代码正在删除My.cnf文件中套接字变量的所有实例,然后使用正确的变量和文件位置重新填充该文件 删除部分工作正常,但是插入在第一行之后退出。因此,它会直接在[mysqladmin]下插入正确的“socket”行,但不会添加到文件的其余部分 另外,如果可能的话,我希望在头和新套接字声明之间有一行空格 我试过2.0.2版和2.2.0版,但都没有达到预期效果。Ansible完全按照预期工作行填充模块用于确保特定行位于指定文件中。模块名称字面上描述了其功能:“文件中的行”。它不是“文件中的行”或“

我的代码正在删除My.cnf文件中套接字变量的所有实例,然后使用正确的变量和文件位置重新填充该文件

删除部分工作正常,但是插入在第一行之后退出。因此,它会直接在[mysqladmin]下插入正确的“socket”行,但不会添加到文件的其余部分


另外,如果可能的话,我希望在头和新套接字声明之间有一行空格


我试过2.0.2版和2.2.0版,但都没有达到预期效果。

Ansible完全按照预期工作<代码>行填充模块用于确保特定行位于指定文件中。模块名称字面上描述了其功能:“文件中的”。它不是“文件中的行”或“文件的一部分中的行”

只能为线条指定一种图案:

socket = /mysql/run/mysqld.sock
因此,在Ansible确保它存在(可能是插入它)之后,所有进一步调用“确保它存在”都不会再次插入它,因为它已经存在(声明式编程就是这样工作的)

在值之后指定不同的
insert\u并不重要,因为like是相同的,并且
之后的
insert\u不是条件的一部分


尽管您没有显示配置文件的确切语法,但它看起来像INI样式的格式(它也像常规的MySQL选项文件,这是一个INI文件),因此您可以尝试使用。

lineinfle
正常工作(请参阅)

你的任务是:

我的代码正在删除My.cnf文件中套接字变量的所有实例,然后用正确的变量和文件位置重新填充该文件

那为什么不用呢

请记住:

用户可以通过确保相同的模式永远不会匹配任何替换来保持幂等性


因此,您可能需要将regexp
^socket.$
更改为只匹配“错误”的内容应替换的值,以防止不必要地更改任务状态。

问题是什么?不幸的是,如果变量名和变量定义之间有选项卡,ini_文件模块将不起作用。因此,您修改现有文件的运气不佳。如果要使用Ansible实现模板,而无需使用自己的解析器,则需要使用模板。
socket = /mysql/run/mysqld.sock
- replace:
    dest: /etc/mysql/my.cnf
    regexp: '^socket.*$'
    replace: 'socket = /mysql/run/mysqld.sock'