使用ansible-lint进行检查功能的确认
通过ansible-lint进行的检查功能
『Ansible構築・運用ガイドブック インフラ自動化のための現場のノウハウ』的第4章提到了可以使用 ansible-lint 来检查 Playbook。书中写到使用 ansible-lint 来进行实际的检查步骤。
出于个人的兴趣,我在这里记录下来,以修正 Playbook 并确认其行为是否发生了变化。
请简述
-
- ansible-lint は、推奨されている Playbook の書き方を提案する
- ansible-lint は、構文のチェックはしない
修正前的 Playbook 和执行结果
Playbook 修正前的执行结果如下。
---
- hosts: all
vars:
ansible_become: yes
ansible_become_method: sudo
tasks:
- name: Install Nginx
block:
- yum:
name: nginx
state: latest
rescue:
- debug:
msg: "Error!"
always:
- debug:
msg: "Always run this section"
[vagrant@localhost chapter4]$ ansible-lint nginx_install.yml
[403] Package installs should not use latest
nginx_install.yml:9
Task/Handler: yum state=latest name=nginx __file__=nginx_install.yml __line__=10
[502] All tasks should be named
nginx_install.yml:9
Task/Handler: yum state=latest name=nginx __file__=nginx_install.yml __line__=10
实际执行结果的含义
在ansible-lint的默认规则中详细解释了意义。
-
- [403] Package installs should not use latest
-
- Defalut Rules では、
-
- Package installs should use state=present with or without a version
-
- となっており、 version の有無にかかわらず state=present を使うべきだと記載があります。
-
- 書籍では version を指定することが推奨されていると説明されていました。
[502] All tasks should be named
Defalut Rules では、
All tasks should have a distinct name for readability and for –start-at-task to work
すべてのタスクは、読む込み可能かつ –start-at-task が機能するための、個別の名前を持つべきだと記載があります。
書籍では名前を指定されていないタスクがあり、修正すればよいと説明されてました。
修改 Playbook(第一次)。
---
- hosts: all
vars:
ansible_become: yes
ansible_become_method: sudo
tasks:
- name: Install Nginx
block:
- name: Install Nginx in block
yum:
name: nginx
state: 1.16.1
rescue:
- debug:
msg: "Error!"
always:
- debug:
msg: "Always run this section"
[vagrant@localhost chapter4]$ ansible-lint nginx_install.yml
[vagrant@localhost chapter4]$ ansible-playbook -i hosts nginx_install.yml --check
PLAY [all] *********************************************************************************
TASK [Gathering Facts] *********************************************************************
ok: [localhost]
TASK [Install Nginx in block] **************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "value of state must be one of: absent, installed, latest, present, removed, got: 1.16.1"}
TASK [debug] *******************************************************************************
ok: [localhost] => {
"msg": "Error!"
}
TASK [debug] *******************************************************************************
ok: [localhost] => {
"msg": "Always run this section"
}
PLAY RECAP *********************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=1 ignored=0
[vagrant@localhost chapter4]$
ansible-lint 沒有問題,但在模擬運行時,出現了狀態(state)指定的方式不同的提示。
嚴重錯誤: [localhost]: 失敗! => {“changed”: false, “msg”: “狀態(state)的值必須是以下之一: absent、installed、latest、present、removed,但得到的是: 1.16.1。”}
因此,我們將指定 name: nginx-1.16.0,state: present。
修改Playbook(第二次)
- hosts: all
vars:
ansible_become: yes
ansible_become_method: sudo
tasks:
- name: Install Nginx
block:
- name: Install Nginx in block
yum:
name: nginx-1.16.0
state: present
rescue:
- debug:
msg: "Error!"
always:
- debug:
msg: "Always run this section"
作为准备工作,按照上述修改进行,确保可以通过yum使用旧版本的Nginx。准备步骤可以参考此处。为了确保,再次确认一下。
[vagrant@localhost chapter4]$ yum --showduplicates list nginx
(中略)
nginx.x86_64 1:1.16.1-1.el7 @epel
Available Packages
(中略)
nginx.x86_64 1:1.16.0-1.el7.ngx nginx-stable
nginx.x86_64 1:1.16.1-1.el7 epel
nginx.x86_64 1:1.16.1-1.el7.ngx nginx-stabl
在 Yum 中显示了可安装的 Nginx 版本列表。
尝试运行 ansible-lint 和干运行。
[vagrant@localhost chapter4]$ ansible-lint nginx_install.yml
[vagrant@localhost chapter4]$ ansible-playbook -i hosts nginx_install.yml --check
PLAY [all] *********************************************************************************
TASK [Gathering Facts] *********************************************************************
ok: [localhost]
TASK [Install Nginx in block] **************************************************************
changed: [localhost]
TASK [debug] *******************************************************************************
ok: [localhost] => {
"msg": "Always run this section"
}
PLAY RECAP *********************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[vagrant@localhost chapter4]$
ansible-lint 不再显示错误,并且因为要更改为旧版本的 Nginx,所以 PLAY RECAP 中的 change=1。
碰到之时无法理解的事情
-
- state=present
-
- インストールの状態を維持することを指定していると意味に気づくのに時間がかかりました。
-
- –start-at-task
-
- ansibleplaybook コマンドで指定できるオプション。指定したタスク名のところから実施できる。
-
- playbook の書き方 (name の位置とversionの指定)
-
- 公式の yum モジュールの name の指定の仕方は以下の通りです。
-
- A package name or package specifier with version, like name-1.0.
-
- したがって、 name=nginx-1.16.0 と記載しました。
-
- name の位置は、いくつかの Playbook を参考に、感覚的に修正してます。
-
- ansible-lint では、typo を検知してくれなかったこと
-
- state=least と打ち間違えをしましたが、 ansible-lint では構文のエラーを拾ってくれませんでした。
- 後に Dry Run 後に構文のエラーが出力されたため修正しました。
文献引用
-
- 八木澤 健人(2019)『Ansible構築・運用ガイドブック インフラ自動化のための現場のノウハウ』,株式会社マイナビ出版,P80-81
-
- Nginx – Installation instructions – RHEL/CentOS
-
- CentOSにちょっと古いバージョンのNginxをインストールする
- Ansible – playbooks_intro