Ansible

Ansibleよくつかうモジュールサンプル

Ansibleのよくつかうモジュールsample

個人的な使用頻度を添えて。思いついたら追記します

  • file ファイルやディレクトリを置く

    • まあまあつかう
# ディレクトリ作成
- file:
    path=/var/tmp/example
    state=directory
    mode=0755

# ディレクトリの中身すべてのオーナーをroot:rootに変更
- file:
    path=/usr/local/hoge
    state=directory
    owner=root
    group=root
    recurse=yes

# ディレクトリのシンボリックリンクを作成
- file:
    src=/usr/local/hoge
    dest=/opt/hoge
    state=link
  • copy ファイルをコピーする

    • 案外使うはず
# vaultと組み合わせて秘密鍵と証明書を配布
- name: copy ssl_cert(with vault)
  copy:
    content: "{{ private_ssl_crt }}"
    dest: '/tmp/server.crt'
  no_log: true
  tags: copy-sslcrt

- name: copy ssl_key(with vault)
  copy:
    content: "{{ private_ssl_key }}"
    dest: '/tmp/server.key'
  no_log: true
  tags: copy-sslkey

# vaultと組み合わせてパスワード入りファイルを配布
- name: copy dbpass
  copy:
    content: "{{ dbpass }}"
    dest: '/root/.mysql_pwd'
  no_log: true
  tags: copy-dbpass
  • lineinfile 正規表現などで指定した行を置換する

    • 結構つかいます
# 設定ファイルの正規表現指定置換
- name: zabbix-agent.conf
  lineinfile: >-
    dest='/etc/zabbix/zabbix_agentd.conf'
    state=present
    backrefs=yes
    regexp='{{ item.regexp }}'
    line='{{ item.line }}'
  with_items:
  - regexp: '^Server=127.0.0.1'
    line: 'Server={{ zabbix_server }}'
  - regexp: '^ListenIP=127.0.0.1'
    line: 'ListenIP=0.0.0.0'
  - regexp: '^# ServerActive='
    line: 'ServerActive={{ zabbix_server }}'
  - regexp: '^# Timeout=3'
    line: 'Timeout=30'
  - regexp: '^Include=/etc/zabbix/zabbix_agentd.d/'
    line: '#Include=/etc/zabbix/zabbix_agentd.d/'
  tags: zabbix30`

2回やってみたり正規表現を単体テストしてみて動確したほうがいいやつ。
複数行まとめてならreplaceつかう。ブロック追加ならblockinfileつかう。

  • template 変数やループや条件を埋め込んだファイルを配置する

    • 超つかう
# apacheの設定ファイルを置く
## templateモジュールで使用する変数を設定
vars:
    virtualhosts:
      - { port: 80, fqdn: site1.example.com, allow_override: True }
      - { port: 80, fqdn: site2.example.com, allow_override: False }

## templateタスクを定義
tasks:
    - name: set virtualhost conf
      template:
        src: 'files/virtual_hosts.conf.j2
        dest: '/etc/httpd/conf.d/virtual_hosts.conf
        owner: 'root'
        group: 'root'
        mode: 0644

## templateモジュールで転送するテンプレートファイル
{% for host in virtual_hosts %}
<VirtualHost *:{{host_port }}>
    ServerName {{ host.fqdn }} 
    DocumentRoot /var/www/html/{{ host.fqdn }}/
    ErrorLog logs/{{ host.fqdn }}-error_log
    CustomLog logs/{{ host.fqdn }}-access_log common
{% if host.allow_override %}

    <Directory /var/www/html/{{ host.fqdn }}/>
        Options FollowSymLinks
        AllowOverride All
    </Directory>
{% endif %}
</VirtualHost>
{% endfor %}

## templateモジュールで設置されたファイル
<VirtualHost *:80>
    ServerName site1.example.com
    DocumentRoot /var/www/html/site1.example.com/
    ErrorLog logs/site1.example.com-error_log
    CustomLog logs/site1.example.com-access_log common

    <Directory /var/www/html/site1.example.com/>
        Options FollowSymLinks
        AllowOverride All
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    ServerName site2.example.com
    DocumentRoot /var/www/html/site2.example.com/
    ErrorLog logs/site2.example.com-error_log
    CustomLog logs/site2.example.com-access_log common
</VirtualHost>

# nginxの設定ファイルを置く(validateつき)
- name: set nginx default config
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    validate: nginx -t -c %s
  notify:
    - nginx-reload
  tags: set-conf-nginx,nginx-latest
  • unarchive アーカイブを解凍する

    • たぶんこのさき使うハズ → と思いきやfileでおなじことできたりするのであんまつかってない。
- unarchive:
    src=hoge.tar.gz
    dest=/usr/local/src
  • group OSグループを作成する

    • つかったことはある
# hogeグループをGID:1001で作成。
- group:
    name=hoge
    gid=1001
  • つかったことはある
# piyoユーザを作成。オプションは全てデフォルト。
- user:
    name=piyo

# hogeユーザを作成。各オプションを指定。
- user:
    name=hoge
    uid=1001
    group=hoge
    groups=wheel
    home=/home/hoge
    shell=/bin/bash
  • yum パッケージをインストールする

    • 最も使うモジュール
# mysqldをyumで入れる
- name: install mysqld
  yum:
    name: "{{ item }}"
    enablerepo: mysql57-community
    state: present
  with_items:
    - mysql-community-server
    - mysql-community-client
    - mysql-community-common
    - mysql-community-libs
    - mysql-community-libs-compat
  tags: install_mysqld
# zabbix3.0をyumで入れる
- block:
  - name: import Zabbix RPM-GPG-KEY
    rpm_key: key=http://repo.zabbix.com/RPM-GPG-KEY-ZABBIX state=present
    tags: zabbix30
  - name: zabbix3.0 release install yum
    yum: name='http://repo.zabbix.com/zabbix/3.0/rhel/{{ ansible_distribution_major_version }}/x86_64/zabbix-release-3.0-1.el{{ ansible_distribution_major_version }}.noarch.rpm' state=present
    tags: zabbix30
  - name: zabbix3.0-agent install
    yum:
      name: "{{ item }}"
      state: present
      enablerepo: zabbix
    tags: zabbix30
    with_items:
      - zabbix-agent
      - zabbix-sender
  when: ansible_os_family == 'RedHat'
  • apt パッケージをインストールする

    • ubuntuやdebianならyumでなくてこっちつかう
# zabbix3.0をubuntuに入れる
- block:
  - name: import Zabbix Debian-Ubuntu-GPG-KEY
    apt_key: 
      url: 'http://repo.zabbix.com/zabbix-official-repo.key'
      state: present
    tags: zabbix30
  - name: zabbix3.0 release install apt
    apt_repository: 
      repo: 'deb http://repo.zabbix.com/zabbix/3.0/ubuntu {{ ansible_distribution_release }} main'
      state: present
    tags: zabbix30
  - name: zabbix3.0 agent install apt
    apt:
      pkg: "{{ item }}"
      state: present
      allow_unauthenticated: yes
#      update_cache: yes
#      cache_valid_time: 0
    tags: zabbix30
    with_items:
      - zabbix-agent
      - zabbix-sender
  when:
    - ansible_distribution == "Ubuntu"
    - ansible_lsb.major_release > 14
  • service サービスの有効無効と起動停止再起動などを制御する

    • 超つかう
# handlerにかくnginxをreload
- name: nginx-reload
  service:
    name: nginx
    state: reloaded

# 複数を無効化
- name: disable services
  service:
    name: "{{ item }}"
    enabled: no
  with_items:
    - auditd
    - lvm2-monitor
    - mdmonitor
    - atd
    - NetworkManager
  tags: disable-services

# ntpd起動と有効化
- name: start ntpd service
  service:
    name: ntpd
    state: started
    enabled: true
  tags: start_enable_ntpd
  • shell コマンドを実行する(複数行,pipe,redirectつかえる)

    • 使ったことはある。registerやwhenと組み合わせたい
# /var/tmp/exampleに移動し、somescript.shを実行して、結果をsomelog.txtに出力
- shell: somescript.sh >> somelog.txt
  args:
    chdir=/var/tmp/example
  • command コマンドを実行する(1行)

    • よく見たら意外と使ってる。registerやwhenと組み合わせたい
# get letsencrypt sslcerts.
- name: obtains cert keys
  command: letsencrypt certonly --webroot -d {{ nginx_servername }} -w /usr/share/nginx/html --email {{ letsencypt_mail }} --agree-tos --keep-until-expiring --non-interactive
  when: use_letsencrypt
  tags: obtains-cert-keys,nginx-ssl
  • set_fact 途中で変わる内容を変数に入れて使うなど
- set_fact:
    ip_mask: "{{ ansible_default_ipv4.address}}/{{ansible_default_ipv4.netmask  }}"
  when: ansible_default_ipv4
  • stat ファイルのステータスを取ってregisterで変数に入れて後のタスクのwhenで分岐につかう
- name: check systemd
  stat:
    path: /usr/bin/systemctl
  register: check_systemd
- name: check if timezone is common_timezone
  shell: /usr/bin/timedatectl status|grep -i 'time zone'|awk '{print $3}'
  register: check_timezone
  ignore_errors: true
  when: check_systemd.stat.xusr 
  • debug その変数の中身はなんなのかを実行時の標準出力に出してたしかめる
- hosts: localhost
  gather_facts: no
  tasks:
  - name: remove_mariadb_libs
    yum:
      name: mariadb-libs
      state: absent
    register: res_malialib_absent

  - name: debug res_malialib_absent
    debug: var=res_malialib_absent.stdout

Ansibleでよく使うモジュール - ものぐさインフラエンジニアの覚書