【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模块。
这是一个标记线模板。
{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工具继续利用,我希望能继续学习并深入了解如何使用。
请以母语中文进行转述,仅提供一种选项:
根据这个信息进行参考。