忙しい人向け
.vscode/settings.json にディレクトリを指定します。
{
"files.associations": {
"**/roles_common/**/*.{yml,yaml}": "ansible"
}
}
ansible.cfgへの roles_path の設定や、.ansible-linter 、 ANSIBLE_ROLES_PATH を指定してもダメなので気を付けてください。
roles_path を追加する
ansibleでRoleは書いてるとだんだん増えてきがちで、<ProjectRoot>/roles ディレクトリに横並びにするとだんだん管理が大変になってきます。
こんな時のために ansible.cfg には、roles_path を指定することでデフォルトの roles/ ディレクトリ以外もRoleのディレクトリとして認識させる機能があります。
[defaults]
roles_path = roles:roles_common:roles_specific
通常コマンドラインから ansible-lint --fix を行う場合は、 ansible.cfg の roles_path を認識してくれるため、特に何もしなくても追加したパスもちゃんと走ります。
Ansible拡張が roles_path を読まない?
VSCodeにはAnsible公式の拡張機能があります。
補完等に加えて、 ansible-lint を使ったフォーマットも可能です。特に ansible.validation.lint.autoFixOnSave を true にしておけば、セーブ時に自動でLinterが走るのでうれしいです。
ただしAnsible拡張は ansible.cfg をプロジェクトルートに置いていても、 roles_path で追加したディレクトリを認識してくれません。
これは拡張機能の挙動によるもので、
- Ansible対象ファイルでフォーマットを走らせる
- 拡張機能が
ansible-lintを呼び出す -
ansible-lintがansible.cfgを読む
という順番で動くことが原因です。特に設定せず追加したディレクトリでフォーマットを走らせても、VSCodeの Output -> Ansible Support には何も表示されません。
要は、拡張機能が直接 ansible.cfg を読み込む事はしていなさそうです。
解決法
解決法としては、.vscode/settings.json にディレクトリ内のファイルは ansible として認識させればOKです。
{
"files.associations": {
"**/roles_common/**/*.{yml,yaml}": "ansible"
}
}
正しく認識していれば、エディタの下がこんな感じの表記になります。
罠
「わざわざこんな記事書かなくてもそうでしょ?」と思うかもしれません。私が引っかかったのはココです。
files.associations を設定していないときの表記がこれです。
Ansible Tasks Schema です。認識してるじゃん。
ですがこれは罠で、 YAML/Ansible Tasks Schema では ansible-linterは走りません。でも中途半端な補完は出ます(word suggestionがoffの環境で出てます)。なんで?
まとめ
大したことはないのですが、わかりづらい表記に引っかかってしまいました。同じような人がこれ以上増えないことを願い、記事にしました😢
普段はJetbrains使いなのですが、そっちは残念ながらWSL環境の OpenTofu を読まなかったり、Ansibleのいい感じのプラグインが無かったりするので、IaCのプロジェクトで普段使わないVSCodeに来たんですが、こっちでも問題にぶつかってしまいました、うーんつらい。
追記
- マルチルートワークスペースの対処法については、分量がが長くなったため別記事に分離しました。こちらも合わせてご覧ください :)


