lineinfile模块与Ansible变量字典无法正常运行

时间:2017-01-13 06:15:37

标签: module ansible

我的代码是删除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,但两者都没有按预期运行。

2 个答案:

答案 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.*$更改为仅匹配"错误"应该替换的值,以防止不必要的任务更改状态。