LoginSignup
0
1

More than 1 year has passed since last update.

【ルール説明】args

Last updated at Posted at 2022-12-26

こちらの記事は Ansible lint Advent Calendar 2022 カレンダー2 21日目の記事になります。

今回はルール args について説明します。

args

args はモジュールを利用する際に必要なパラメーターが全て渡されているかを検証します。args はモジュールのコードを読み込み内部的に解析します。モジュールのパラメーターを処理する部分でmutually_exclusiverequired_togetherrequired_one_ofなどの条件からモジュールを利用する際に必要なパラメーターを判断します。

問題のあるコードその1

---
- name: Fixture to validate module options failure scenarios
  hosts: localhost
  tasks:
  - name: Clone content repository
    ansible.builtin.git: # <- パラメーター repo が定義されていない
      dest: /home/www
      accept_hostkey: true
      version: master
      update: false

修正されたコードその1

---
- name: Fixture to validate module options pass scenario
  hosts: localhost
  tasks:
  - name: Clone content repository
    ansible.builtin.git: # <- repo を定義する
      repo: https://github.com/ansible/ansible-examples.git
      dest: /home/www
      accept_hostkey: true
      version: master

問題のあるコードその2

---
- name: Fixture to validate module options failure scenarios
  hosts: localhost
  tasks:
  - name: Copy an object already stored in another bucket
    amazon.aws.s3_object:
      bucket: mybucket
      object: /my/desired/key.txt
      # mode が copy になっているが copy_src.bucket が定義されていない
      mode: copy
      copy_src:
        object: /source/key.txt

修正されたコードその2

---
- name: Fixture to validate module options pass scenario
  hosts: localhost
  tasks:
  - name: Copy an object already stored in another bucket
    amazon.aws.s3_object:
      bucket: mybucket
      object: /my/desired/key.txt
      mode: copy
      copy_src:
        bucket: srcbucket  # <- copy_src.bucket を定義する
        object: /source/key.txt

問題のあるコードその3

---
- name: Fixture to validate module options failure scenarios
  hosts: localhost
  tasks:
  - name: Use quiet to avoid verbose output
    ansible.builtin.assert:
      test:
        - my_param <= 100
        - my_param >= 0
      quiet: invalid # <- quiet の値が無効

修正されたコードその3

---
- name: Fixture to validate module options pass scenario
  hosts: localhost
  tasks:
  - name: Use quiet to avoid verbose output
    ansible.builtin.assert:
      test:
        - my_param <= 100
        - my_param >= 0
      quiet: true # <- quiet の値は boolean 型で定義する

特殊なケースその1

リスト形式の変数を利用したい場合は Ansible lint の検証を無効にします。

問題のあるコード

group_vars/all
---
# リスト型の変数を定義する
security_group_rules:
  - proto: tcp
    from_port: "{{ ssh_port }}"
    to_port: "{{ ssh_port }}"
    cidr_ip: '0.0.0.0/0'
  - proto: icmp
    from_port: 8
    to_port: -1
    cidr_ip: '0.0.0.0/0'
some_playbook.yml
---
- name: Fixture to validate module options failure scenarios
  hosts: localhost
  tasks:
  - name: Create security group
    amazon.aws.ec2_security_group:
      name: "{{ security_group_name }}"
      description: "{{ security_group_name }}"
      profile: "{{ profie | default(omit) }}"
      rules: "{{ security_group_rules }}" # <- 本来はリスト型のオプションなのでエラーになる
      rules_egress: "{{ security_group_rules_egress }}"
    register: security_group

修正されたコード

group_vars/all
---
# リスト型の変数を定義する
security_group_rules:
  - proto: tcp
    from_port: "{{ ssh_port }}"
    to_port: "{{ ssh_port }}"
    cidr_ip: '0.0.0.0/0'
  - proto: icmp
    from_port: 8
    to_port: -1
    cidr_ip: '0.0.0.0/0'
some_playbook.yml
---
- name: Fixture to validate module options pass scenario
  hosts: localhost
  tasks:
  - name: Create security group # noqa: args[module] <- 検証を無効にする
    amazon.aws.ec2_security_group:
      name: "{{ security_group_name }}"
      description: "{{ security_group_name }}"
      profile: "{{ profie | default(omit) }}"
      rules: "{{ security_group_rules }}" # <- 検証が無効になっているためエラーにならない
      rules_egress: "{{ security_group_rules_egress }}"
    register: security_group

特殊なケースその2

オプションのパラメーターがいくつものパターンを取りうる場合は Ansible lint の検証を無効にします。

修正されたコード

---
# url と data は同時に定義できないが変数などで動的に制御したい
- name: Fixture to validate module options pass scenario
  hosts: localhost
  tasks:
  - name: Add apt keys  # noqa: args[module] <- 検証を無効にする
    become: true
    ansible.builtin.apt_key:
      url: "{{ zj_item['url'] | default(omit) }}"
      data: "{{ zj_item['data'] | default(omit) }}"
    loop: "{{ repositories_keys }}"
    loop_control:
      loop_var: zj_item

参考サイト

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1