【ansible】使用blockinfile模块时,需要注意确保幂等性

首先

我最近第一次接触到了Ansible。作为Ansible的特点之一,可以经常看到冪等性得到保留的情况。但是,当我使用blockinfile模块时,发现无法保持冪等性,导致遇到了一些困难。所以,这次我想总结一下这个问题。

另外,在这里我们将省略对Ansible的详细解释。我希望在某个时候也能写一篇面向Ansible初学者的总结文章。

首先,”冪等性(べきとうせい)”是什麼意思?

我最近也才刚明白这个词的意思,它在AWS官方也有以下的解释。

首先,”べき等性” 是什么意思呢?这是指“进行一次或多次操作的结果都是相同的”概念。

参考资料:给对无服务器(Serverless)感兴趣的开发者介绍“幂等性”

环境

本次执行ansible的环境如下所示。

    • ansible実行サーバ:AWSアカウント上のEC2(Amazon Linux2)★便宜上Aサーバとします

 

    • ansibleバージョン:2.9.23

 

    適用先サーバ:AWSアカウント上のEC2(Amazon Linux2)★便宜上Bサーバとします

使用Dynamic Inventory,可以动态获取适用于EC2实例的目标服务器的信息。
Dynamic Inventory参考网站:[AWS]使用Ansible的Dynamic Inventory通过标签等灵活指定执行目标的EC2。

做过的事情 de

创建playbook

我会创建一个名为”ansible-blockinflie.yml”的playbook。

首先,我们将按照如下所示的内容进行创作。

- hosts: tag_Name_{EC2インスタンス名}
  user: ec2-user
  become: yes
  vars_files:
    - ../../config/common.yml

    - name: create file
      file:
        path: /home/ec2-user/create-file.txt
        state: touch

    - name: add to file
      blockinfile:
        path: /home/ec2-user/create-file.txt
        block: |
          test01
          add to file

当在A服务器上运行ansible时,我们可以在B服务器上创建以下文件。

$ cat create-file.txt
# BEGIN ANSIBLE MANAGED BLOCK
test01
add to file
# END ANSIBLE MANAGED BLOCK

这样也可以,但是我不太喜欢在文本的前后加上”# {BEGIN/END} ANSIBLE MANAGED BLOCK”这样的字。

增加 marker 选项。

因此,我尝试修改playbook如下。

- hosts: tag_Name_{EC2インスタンス名}
  user: ec2-user
  become: yes
  vars_files:
    - ../../config/common.yml

    - name: create file
      file:
        path: /home/ec2-user/create-file.txt
        state: touch

    - name: add to file
      blockinfile:
        path: /home/ec2-user/create-file.txt
        marker: ""               ★←追記
        block: |
          test01
          add to file

据说,通过添加 marker 选项并指定 “”,可以防止在文本前后插入字符。

我还在A服务器上运行了ansible,并在B服务器上确认了所创建的文件。

$ cat create-file.txt

test01
add to file

没有在文本前后插入任何字符,变得清爽了。但正如标题所述,会导致无法保持幂等性的操作发生。

为了验证幂等性,请在playbook中不做任何修改,在A服务器上执行ansible,并再次在B服务器上检查文件。结果如下:

$ cat create-file.txt

test01
add to file

test01
add to file

太意想不到了,相同的字符串被追加到了末尾。
这样一来,每次执行ansible就会不断地将字符串追加到create-file.txt中。

在这里,虽然现在有点晚了,但还是要好好查看blockinfile模块的参考文档。
参考文档:ansible.builtin.blockinfile模块。

キャプチャ.JPG

这是一个标记线模板。
{mark}将被marker_begin(默认为“BEGIN”)和marker_end(默认为“END”)的值替换。
如果在没有{mark}变量的情况下使用自定义标记,可能会在接下来的剧本执行中重复插入块。

在执行之后的《后续策略手册》中,可能会重复插入若干个方块。

写得很清楚呢。
我们要好好阅读参考资料。

由于我觉得默认插入的文字有点不太合适,所以我决定自定义为以下内容并重新更新playbook。

- hosts: tag_Name_mds_dev_someya_fluentd_temp
  user: ec2-user
  become: yes
  vars_files:
    - ../../config/common.yml
   
    - name: create file
      file:
        path: /home/ec2-user/create-file.txt
        state: touch

    - name: add to file
      blockinfile:
        path: /home/ec2-user/create-file.txt
        marker: "# {mark} add to file"     ★←追記
        block: |
          test01
          add to file

再次在A服务器上运行Ansible,并在B服务器上进行文件确认。

$ cat create-file.txt
# BEGIN add to file
test01
add to file
# END add to file

使用自定义字符串插入了标记吗?我尝试在A服务器上多次执行了ansible,但结果是不会在末尾添加任何内容,并且保持了幂等性!

最后一点

也许最终如果没有使用marker选项,就不会出现之前在playbook中创建的文件的错误吧?但是我认为,记录下我在实际编码过程中不断查找和试错的经历,可以更好地理解这个选项的作用,因此我特意选择了这种形式进行记录。

如果感觉到有些动作不对劲,立即查看参考资料!这是铁则。

这次我第一次尝试了使用Ansible,但并没有太多复杂的语法,感觉挺容易上手的。
为了将其作为一个IaC工具继续利用,我希望能继续学习并深入了解如何使用。

请以母语中文进行转述,仅提供一种选项:

根据这个信息进行参考。

 

广告
将在 10 秒后关闭
bannerAds