在学习Ansible之前,需要记住的要点

概括

如果您是打算开始学习Ansible的人,只需要掌握以下要点,我觉得您可以以高效的方式学习。

大门

最好选择有系统地整理信息的书籍作为入门。

Ansible徹底入門 ←私はこれから入りました
Ansible実践ガイド
初めてのAnsible

公式最佳实践

这里详细说明了各种资源的文件结构和命名规则,其他方面则需要我们通过试验和错误来找到适合我们自己的东西。

让我们阅读有关最佳实践的Ansible剧本指南。

请使用以下链接:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html

樱互联网公司发布的
《实践!Ansible最佳实践(上篇)》
《实践!Ansible最佳实践(下篇)》。

思考IT
「创造出更实践的Playbook」

「Ansible个人最佳实践」

如果系统规模相当大的话

请务必制定命名规则。
不仅限于Ansible,在规模扩大时,源代码管理会成为一个问题。
建议制定一套固定的规范来进行管理。

规约例)
1. 所有成员必须遵守本规约。
2. 未经许可,禁止在会议期间使用手机。
3. 必须准时出席会议,迟到者将被罚款。
4. 会议期间禁止随意离席。
5. 在会议上发言时,应互相尊重,不得打断他人发言。
6. 会议记录应准确无误地记录,并及时公布给成员。
7. 若对规约内容有任何疑问或建议,请向管理团队提出。
8. 任何违反规约的行为都将受到处罚或解雇。
9. 成员有义务保守会议讨论的机密信息。
10. 本规约为全体成员所共同遵守,可根据需要进行修订。


- タスクやプレイブック内で宣言した変数は**アンダースコア**から開始する変数名にすること(`_xxx`)
- `register`の変数名は`_result_xxx`とする
- 変数名、ロール名、playbook名、ファイル名、タスク名の命名規則はスネークケースとする(Ansibleの規約)
- 変数名の開始文字列に **`ansible_`を使用してはならない**(Ansibleの予約変数名)
- jinja2テンプレートはファイル名に`j2`を含めること(区別するため)
- 環境ごとに変数の階層分けする場合は、以下のように命名すること
    - 本番用:`prd`
    - 本番検証用:`prd_dev`
    - システム管理用(ansible、zabbix):`sys`
    - ステージング環境の場合は、ファイル名に`prd`(本番)、`dev`(開発)
- YAMLファイルの先頭行は`---`を必須
- 変数ファイルはYAMLファイルを用いる(JSONはコメントを記載できないため、不採用)
- 機密情報(パスワード、アクセストークンなど)は情報漏えいを防ぐために**ansible vault**で暗号化する(作成方法は別紙参照)
- タスク名の先頭はそのタスクが属性を表すものとする<br/>
    例)<br/>
    ```
    # AWS関連の場合
    tasks/aws_xxx.yml
    # アプリ関連の場合は
    tasks/app_xxx.yml
    ```
- 実行ログでどのタスクなのかがわかるように`name`を付与する
- whenで同一変数に対して複数のor条件を指定する場合は、`in list`を用いること<br/>
    ```
    # NG
    - debug:
        msg: "test"
      when: myvar == "test1" or myvar == "test2" or myvar == "test3"

    # OK
    - debug:
        msg: "test"
      when: myvar in ["test1", "test2", "test3"]
    ```
- whenのand条件の場合は、以下のようにリスト形式で記載すること<br/>
    ```
    - debug:
        msg: "test"
      when:
        - myvar == "test1"
        - myvar2 == "test2"
        - myvar3 == "test3"
    ```
- jinjaテンプレート内のコメントは`{#- hogehoge -#}`を使用すること<br/>
    ```
    - set_fact:
        _hoge: >-
          {#- hogeを作成 -#}
    ```
- AWSリソースのタグキーはスネークケースとし、各単語の最初を大文字とする<br/>
    固有名詞や略語は、すべて大文字で可とする
    ```
    Name: hoge
    APP_Version: 5.1.1
    ```

## 自作モジュール
- モジュール名の接頭語に`hoge_`とすること
- 冪等性を担保するような実装にすること
    (すでに状態を満たしている場合は、処理をしない)
- 適宜にコメントを残すこと(特にビジネス条件にかかわる部分)

如果您已经在使用Docker的话。

在使用可以立即销毁的Docker容器进行学习可以提高效率。此外,多台和多种环境(如Centos、Ubuntu等)可以轻松准备,这也是其魅力所在。来自Qiita的文章《在Docker内学习Ansible》。

如果要处理认证信息的话

可以使用Ansible Vault来加密,这样就可以放心地将认证信息与源代码一起提交。

如果你要处理对话形式的安装程序。

使用expect模块吧!不要忘记在执行环境中安装python的pexpect。

请注意避开 Ansible expect 模块的陷阱。

我想轻松一点。想要参考现有的代码。

让我们使用 Ansible Galaxy!有各种不同的代码可以公开使用,只需使用 ansible-galaxy 命令即可立即使用。

如果在实际运用中使用Ansible

一定要引入AWX或Ansible Tower。
可以通过GUI操作Ansible,并使用执行历史记录、执行权限控制和易于集成其他系统的RestAPI等功能。
虽然功能上AWX与Ansible Tower相同,但Ansible Tower具有更好的支持和稳定性。
如果经济条件允许,请务必考虑引入Ansible Tower。

– “如何在Docker版AWX中构建AWX”
– “如何在AWS上构建高可用性的AWX”
– “如何将AWX 17.x配置为集群(HA)结构”

通过API传递的变量在处理过程中无法被覆写!

通过AWX或Ansible Tower的API传递的变量被视为extra vars(最优先变量),在处理过程中不能覆盖这些变量。不过,可以添加或修改不存在的键。请注意,有时候在本地运行正常,但在AWX或Tower上可能无法正常运行!

※变量的优先顺位

变量

当你开始熟悉了一定程度之后,会增加需要动态创建变量的情况。
在这种情况下,只要记住这个,就不用担心Ansible的(动态)变量了。

自己编写的模块 de

大部分的事情都可以通过Ansible来解决,但如果需要自行开发时,不要害怕,可以按顺序阅读《Ansible模块开发》一书,非常容易掌握!

参考:创建适用于AWS的Ansible自定义模块

默认设置并不是“全有”或“全无”。

使用Ansible的任务执行会在多个主机上进行并行处理
在默认设置下,只要有一个主机出现错误,处理就不会中断
因此,默认情况下,即使某个主机出现错误,也会被忽略,这是危险的!

为了达到全部成功或全部失败的目的,可以通过max_fail_percentage来设定错误容忍量。强烈建议将此设定值始终设置好!
但是,请注意,如果无法到达操作目标主机,则不会将其视为错误,这时应使用any_errors_fatal!

在API调用模块中,一定要添加重试处理(或参数)!

在调用API并执行某些操作的模块中,经常会因为调用限制(即每秒可以调用的次数)或网络质量问题而产生错误。为了减少这种中断处理带来的困扰,应该实现可重试的处理机制,同时确保幂等性!(※在此提到的幂等性是指确保重试处理不会增加资源的数量)

以下的三个措施 de ge

    1. 对于自定义模块,应该在模块内部实现重试处理。

 

    对于官方模块,如果提供了retries参数,应该进行相应的设置!还可以使用until实现重试处理。

开发环境

如果你使用VSCode进行开发,那么通过「VSCode 是一个完美选择的 Ansible 开发环境!特别是推荐给 Windows 用户)」,一切都搞定!我们将使用 Docker,但使用它并无需意识到 Docker 的存在。

如果你打算从现在开始,那就使用Ansible 2.10.x吧!

2.10.x版本之前与2.10.x版本的模块配置发生了彻底的变化。

以AWS的EC2模块为例

直到2.9.x版本为止,ec2模块存在。

- ec2:
    key_name: mykey
    instance_type: t2.micro    

从2.10.x版本开始的amazon.aws.ec2模块。

- amazon.aws.ec2:
    key_name: mykey
    instance_type: t2.micro

从2.9.x版本开始,许多模块在Ansible的代码库中进行管理,但现在它们已被根据各模块进行了分离。
与AWS相关的模块将由这里进行管理。
虽然在2.10.x版本中,2.9.x的模块名称也能够运行,但并不保证全部都能正常工作,所以如果你打算开始使用的话,最好还是学习2.10.x版本!

参考1: 我总结了《Ansible 2.9→2.10版本的改变点》。
参考2: 《Ansible 2.10版本的改变点》:附带模块移到Ansible Collection中。

让我们开始学习Python3吧!

由于Python2支持已经终止,因此Ansible需要支持Python3!基本上,在运行Ansible的环境和操作目标终端上都必须安装Python3。

并不意味着Python2无法运行,而是指官方已经停止支持,因此组织内部需要决定如何应对并作出相应的措施!

参考:将Ansible从Python2.x升级到Python3.x的步骤和故障排除。

如果你考虑使用AWS的EC2连接SSM插件,请注意!

在日常使用中,我们通常会使用EC2进行SSH连接,但将认证信息的管理完全集成到AWS,并切换到SSM插件以解放SSH密钥的管理也是一个选择。然而,如果同时连接的节点很多(超过30个),我们不建议使用SSM。原因是,在SSM连接时会调用AWS API,但由于API调用速率限制,可能会导致出错。

担心!没有人可以听到。

没问题!因为有日本的Ansible用户社区(Slack),所以请随时提问!我们会迅速回复,并用安心的日语解答您。

广告
将在 10 秒后关闭
bannerAds