かゆいところに手が届く感じのAnsibleモジュールなど

好きなモジュールというか便利だなと思うやついくつか失礼します。
今年度前半けっこうAnsibleまみれだった思い出の記録。
1個選ぶの無理でした。ぜんぶべんりですきです。

####1.[set_fact](https://docs.ansible.com/ansible/latest/modules/set_fact_module.html#set-fact-module)

後続のタスクでつかう変数をタスクの途中で定義できるモジュール
debugと一緒に何の値が入ってるか確認しながらつくる

以下はレプリケーションするためのマスタのIPをとってきて変数に入れている様子。

```yaml

- name: マスタのIPアドレスを取得
  set_fact:
    play_fact_primary: "{{ item }}"
    play_fact_primary_replication_ip: "{{ hostvars[item]['ansible_%s'|format(mysql_replication_network_device)].ipv4.address }}"
```
途中で変わる値を定義したりなどが可能なので、設定した後にその値を元になにかできる
変数を俯瞰したいときに探すのが若干面倒かもしれない（findすればいいけど）

####2.[stat](https://docs.ansible.com/ansible/latest/modules/stat_module.html#stat-module)
ファイルの属性などで処理を分岐するときによくつかいます。

以下はstatでpathに指定したファイルをregisterに入れて、そのステータス（存在するか）を用いてもし、存在しなかったらget_urlでダウンロードしてdestに配置します。

```yaml

- name: check gsuite
  stat:
    path: "{{ gsuite_dir }}/google-cloud-sdk/bin/gcloud"
  register: chk_gs
  check_mode: no

- name: download gsuite
  get_url:
    url: "{{ gsuite_arc_uri }}/{{ gsuite_arc_file }}"
    dest: "{{ gsuite_dir }}/{{ gsuite_arc_file }}"
    mode: 0755
  when: not chk_gs.stat.exists
```

冪統性を保証したい、このファイルが存在してたら実行権限があったらまたはなかったら、whenで条件を指定するかんじ。
モジュールなので、ansibleのバージョンが上がって書き方が変わったというめんどくさい修正をしなくてはならなくなる機会が少ないと思われるところがだいぶ気に入ってる次第です（2.4向けに書いたら2.0.0.3の環境に合わせて書き直さないといけなくなったりしたけどstatはさわらないでも大丈夫だったぞーありがとうございまーす）

`check_mode: no`と書くと、-Cつけてるときも動いてくれるので後続タスクが失敗しないです。

####3.[template](https://docs.ansible.com/ansible/latest/modules/template_module.html#template-module)
変数を埋め込んだファイルを配布できるモジュール
factで取れるOSスペックにあわせて設定値を自動計算でいれたり、
factで取れるNICのネットワーク情報に合わせて設定したり、
場合によって変えたい値を変数にして配ったりなど色々べんり。

以下はバックアップスクリプトを配置してcron登録してるのですが、その中身のクレデンシャルやキー的な情報を変数として扱い配布しています。

```yaml

- block:
  - name: copy backup script for azureblob
    template:
      src: backup.sh-gitlab-azureblob 
      dest: /opt/bin/backup.sh
    no_log: True

  - name: set cron job for backup to azureblob
    cron:
      name: "gitlab backup(send to remote storage)"
      user: 'root'
      job: '/opt/bin/backup.sh'
      minute: '0'
      hour: '3'
      weekday: '0'
  when: use_azureblob_bkup_script == 'yes'
```
CIDRプレフィクス指定したいときは[netaddr](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters_ipaddr.html)でさらに便利
あとはグループのインベントリ情報に合わせてとか、jinja2の機能でforとかif分岐とかいろいろできてだいぶべんり。
複数行とかも別にパイプでやると渡せるのでblockinfileとか要らないのでは派。
fileモジュールはディレクトリつくるとか圧縮ファイル展開して配置とかじゃないとつかわず設定するだけとかなら大体ぜんぶtemplateつかうかんじです

####4.[lineinfile](https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html#lineinfile-module)
ファイルの中身をsedれるやつです。

```yaml

- name: setting exclude about clustaring packages.
  lineinfile:
    state: present
    dest: "/etc/yum.conf"
    regexp: '^exclude=kernel.*'
    line: 'exclude=kernel* pacemaker pacemaker-libs corosync cluster-glue heartbeat resource-agents'
    backup: yes
```
バージョンごとにtemplateを用意するのが激しく面倒だが設定することは同じである
というようなときにだいぶべんり。スクリプトそんなに書かない人にも分かりやすいと好評。
しかしちゃんと網羅的にいろいろなパターン動確しないと正規表現まちがってたとかなりやすいかもしれないとこは実はちょっとめんどくさいんじゃないでしょうかー。

####5.[shell](https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module)
パイプつかいたいような複数行の処理を好きにかきたいときにべんり

```yaml

- name: pipコマンド確認
  shell: which pip
  register: check_pip
  when: check_python|succeeded
```
やっぱshellやcommandモジュールのめんどくさいとこは冪統性を自ら担保するために少なくとも手前にはcheckタスクかかないといけないあたり

####6.[command](https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module)
実行ディレクトリ指定して1行でパイプ無しでなにかしたいときにべんり

```yaml

- name: install gsuite
  become: yes
  become_user: {{ gsuite_user }}
  command: chdir={{ gsuite_dir }} {{ gsuite_dir }}/google-cloud-sdk/install.sh -q --rc-path ~/.bashrc
  when: not chk_gs.stat.exists
```


####7.[debug](https://docs.ansible.com/ansible/latest/modules/debug_module.html#debug-module)
set_factやregisterやhost_varsの戻り値を見たいときなどにべんり

```yaml

# hostvarsの確認単体テスト用(以下のように実行）
# ansible-playbook test/debug_hostvars.yaml > test.log --vault-password-file=path-to-file
---
- hosts: all
  gather_facts: yes
  tasks:
   - name: "dump variables hostvars"
     debug: var=hostvars[inventory_hostname] 

   - name: "dump variables vars"
     debug: var=vars
```
失敗というほどでもないですが確認してたdebugの消し忘れはしたことあるよ
あと変な名前のテスト用タグの消し忘れとかswpファイル混入とかたまにやらかしますね（fix bugとか雑なgitのコメントいれてけします）
(全部流すと時間かかってめんどくさいので変えたとこだけテストするのに一時的にtagつけて指定してそこだけ流すことがあるんですがinclude_varsとか無駄につかうと部分実行では読まれないみたいな動きするみたいなやらかしもしたことあります)

####8.[get_url](https://docs.ansible.com/ansible/latest/modules/get_url_module.html#get-url-module)
ダウンロードして置くだけのときにべんり
commandでもいいけどモジュールつかうと地味に確認タスクかかなくても冪等になるのでべんり

```yaml

- name: download repo about network:ha-clustering
  get_url:
    url: '{{ pacemaker_yumrepo_url }}'
    dest: "/etc/yum.repos.d/{{ pacemaker_yumrepo_file }}"
```
リンク先がなくなると詰むのでgitリポジトリに入れたくないときはオレオレカスタムパッケージレポジトリかマイストレージバケットなどに置いてダウンロードするといいかもしれない

[クラウドモジュール](https://docs.ansible.com/ansible/latest/modules/list_of_cloud_modules.html)もあるようでgcpのバケット管理したいなら[gc_storage](https://docs.ansible.com/ansible/latest/modules/gc_storage_module.html#gc-storage-module) でAWSのS3なら[aws_s3](https://docs.ansible.com/ansible/latest/modules/aws_s3_module.html#aws-s3-module)でAzureのBlobだと[azure_rm_storageblob](https://docs.ansible.com/ansible/latest/modules/azure_rm_storageblob_module.html#azure-rm-storageblob-module)でいけるようです（試してはいない）


####9.[meta](https://docs.ansible.com/ansible/latest/modules/meta_module.html#meta-module)
いまこのとき設定が反映されてほしい場合にげんざい実行されてないハンドラをまとめて実行してくれる

```yaml

- name: set unit files(for oom-killer)
  template:
    src: postgresql.service.j2
    dest: /etc/systemd/system/postgresql-9.6.service.d/override.conf
  notify: run-daemon-reload

- meta: flush_handlers  

- name: set configs
  template: 
    src: "{{ item.name }}.j2"
    dest: "{{ item.path }}/{{ item.name }}"
  with_items: "{{ postgresql_confs }}"
  notify: restart-postgresql
  when: ( postgresql_confs != '' and postgresql_confs is defined )
  tags: pgconf
```
個別に指定して実行はできないとこは多少はふべんかもしれない（とくに困っては無い）

####10.[import_tasks](https://docs.ansible.com/ansible/latest/modules/import_tasks_module.html#import-tasks-module)
処理を分岐したいときに別ファイルにしてよみこませるなどする
長いでかいファイルをみるのがつらいときにもべんり

```yaml
  pre_tasks:
    - import_tasks: roles/baseimage/tasks/pip.yml
      tags: pip
```
モジュールじゃないけどdelegate_toとrun_onceもグループ内の指定した1台だけで処理したいときとかに何気にべんり。

```yaml

  - name: 準マスタ情報取得(master status)
    mysql_replication2:
      mode: getmaster
    delegate_to: "{{ play_fact_secondary }}"
    register: mysql_replication_secondary_stat
```

```yaml
- name: load cib.xml
  command: 'pcs cluster cib-push /root/cib.xml'
  when: chk_resource.stdout == '0'
  run_once: true 
## run_onceによりclusterの片側だけがmasterとして稼働
```

###そのた
####[nmctl](https://docs.ansible.com/ansible/latest/modules/nmcli_module.html#nmcli-module)
NetworkManager自体がけっこう慣れないとめんどくさくていろいろアレというのと、やりたい処理が全部できるわけではないので改造が要るかんじだった
設定ばらまくならtemplateつかえたほうが楽かもしれないかな（どちらかに寄せないと冪等でない感じになるというか）

```yaml

- name: set ipv4 address(for change method to manual)
  nmcli:
    conn_name: "System {{ item }}"
    ifname: "{{ item }}"
    type: ethernet
    ip4: "{{ ip_mask|ipv4('host/prefix') }}"
    gw4: "{{ ansible_default_ipv4.gateway }} "
    method: manual
    autoconnect: true
    state: present
  when: ip_mask is defined
  with_items: "{{ ansible_interfaces|reject('search', 'lo')|list }}"
  tags: set-ipv4-addr,nmcli
  notify: reload-network
```

むかしかいたモジュール関連の記事（よくつかう・目的別逆引きモジュール）
https://qiita.com/smallpalace/items/eb4fc1d13989993d63b9
https://qiita.com/smallpalace/items/113c2a35c7e550bb9045
グループ毎に処理内容分岐するやつ
https://qiita.com/smallpalace/items/dff5f602f6772c04360e
起動スクリプトで搭載スペックに応じ自動設定するやつ（記事のいちぶぶん）
https://qiita.com/smallpalace/items/d331e65d1e4b57e1c973