我的代码是删除my.cnf文件中的所有套接字变量实例,然后使用正确的变量和文件位置重新填充该文件。
删除部分工作正常,但插入在第一行之后退出。所以它会插入正确的插座'直接在[mysqladmin]下面行,但它不会添加到文件的其余部分。
- name: modify my.cnf setting
hosts: dbservers
remote_user: dbuser
become: yes
tasks:
- name: delete old socket definitions
lineinfile:
dest: /etc/mysql/my.cnf
regexp: "^socket "
state: absent
- name: add new socket variable
lineinfile:
dest: /etc/mysql/my.cnf
line: "{{ item.line }}"
insertafter: "{{ item.insertafter }}"
with_items:
- { line: 'socket = /mysql/run/mysqld.sock', insertafter: '^\[mysqladmin\]' }
- { line: 'socket = /mysql/run/mysqld.sock', insertafter: '^\[mysql\]' }
- { line: 'socket = /mysql/run/mysqld.sock', insertafter: '^\[mysqldump\]' }
- { line: 'socket = /mysql/run/mysqld.sock', insertafter: '^\[mysqld\]' }
另外请注意,如果可能的话,我希望在标题和新套接字声明之间有一行空格。
我已尝试使用版本2.0.2和2.2.0,但两者都没有按预期运行。
答案 0 :(得分:1)
Ansible完全符合预期。 lineinfile
模块用于确保特定行位于指定文件中。模块的名称按字面描述其功能:“行 >> 行。它不是“文件中的行”或“文件的一部分中的行”。
您只为该行指定一种模式:
socket = /mysql/run/mysqld.sock
所以在Ansible确保它存在之后(可能插入它),所有进一步调用“确保它存在”都不会再插入它,因为它已经存在(这就是声明式编程的工作原理)。
指定不同的insert_after
值并不重要,因为类似的是insert_after
不是条件的一部分。
虽然您没有显示配置文件的确切语法,但它看起来像INI样式的格式(它看起来像一个常规的MySQL选项文件,它是一个INI文件),因此您可以尝试使用{{ 3}}而不是。
答案 1 :(得分:1)
lineinfile
可以正常工作(请参阅@techraf's answer)。
你的任务是:
我的代码是删除my.cnf文件中所有实例的套接字变量,然后使用正确的变量和文件位置重新填充该文件。
为什么不使用replace?
- replace:
dest: /etc/mysql/my.cnf
regexp: '^socket.*$'
replace: 'socket = /mysql/run/mysqld.sock'
请记住:
通过确保相同的模式永远不会与任何替换相匹配,由用户维护幂等性。
因此,您可能希望将正则表达式^socket.*$
更改为仅匹配"错误"应该替换的值,以防止不必要的任务更改状态。