カテゴリー: linux

  • HAproxyでHR構成を組む on AWS

    HAproxyでHR構成を組む on AWS

    はじめに

    DBサーバへ接続する際、readレプリカを複数台作ることが一般的だが、readレプリカに対してバランシングはインフラの設計ポイントとなる。auroraであれば自動でreadレプリカを作ってくれるのでその考慮は要らないがレガシーなシステムを運用している場合それは使えない。今回はAWSで組むこととする。

    やりたいこと

    多くのプログラムはそうであろう構成。

    プログラムは更新用(write)と参照用(read)で接続先を変え、
    データベースはMasterとSlaveでレプリケーションをしている。

    Slaveは今後増える可能性もあるのに加え、Slaveが1台ダウンしてもサービスが稼働できるようにするには、クラスタリング構成をする必要がある。

    クラスタリングソフトの検討

    名前考察
    keepalived名前解決不可能。また、ググっても実績なし
    HAProxyAmazon linuxでyumでのversionが古い(1.5.2)。v1.6の resolvers オプションを使ってVPCのnameserverを参照するようにし、A Recordの変更に追従させる事が可能だが、ソースからのinstallになってしまう
    MySQL Routerアルファ版 本番利用 非推奨
    Consul by HashiCorpググっても出ない
    ProxySQLAmazonLinux非対応

    keppalivedはAWSでは難しいようだ。

    今回はHA proxyで実現することにした。

    対応

    Amazon linuxの上にHAproxyを使いクラスタリングを実現する。

     

    HAproxyのインストール

    amazon linuxの場合、yumでinstallしようとすると、versionが古い。

    そのため、sourceでインストールすることにした

    yum install -y gcc
    cd /usr/local/src/
    wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.8.tar.gz
    pwd
    tar xvfz haproxy-1.8.8.tar.gz
    ls -ltr
    cd haproxy-1.8.8
    make TARGET=generic
    make install
    

    HAproxyの設定

    設定は以下の通り

    $ cat /etc/haproxy/haproxy.cfg 
    global
        log         tsukada01 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4096
        user        haproxy
        group       haproxy
        daemon
        stats socket /var/lib/haproxy/stats
        stats maxconn 1
        stats timeout 120s
    
    resolvers awsvpc
        nameserver vpc 172.20.0.2:53
    
    defaults
        mode        tcp
        log         global
        retries     3
        timeout     connect 10s
        timeout     client 1m
        timeout     server 1m
        timeout     check 10s
        maxconn     512
    
    listen mysql
        bind tsukada01:3306
        mode tcp
        option mysql-check user haproxy_check
    
        balance roundrobin
    
        option          log-health-checks
    
        server read01 dbserver01:3306 check port 3306 resolvers awsvpc inter 2000 fall 3
        server read02 dbserver02:3306 check port 3306 resolvers awsvpc inter 2000 fall 3

    もう片方のサーバは今の通りに設定した

    $ cat /etc/haproxy/haproxy.cfg
    global
        log         tsukada02 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4096
        user        haproxy
        group       haproxy
        daemon
        stats socket /var/lib/haproxy/stats
        stats maxconn 1
        stats timeout 120s
    
    resolvers awsvpc
        nameserver vpc 172.20.0.2:53
    
    defaults
        mode        tcp
        log         global
        retries     3
        timeout     connect 10s
        timeout     client 1m
        timeout     server 1m
        timeout     check 10s
        maxconn     512
    
    listen mysql
        bind tsukada02:3306
        mode tcp
        option mysql-check user haproxy_check
    
        balance roundrobin
    
        option          log-health-checks
    
        server read01 dbserver01:3306 check port 3306 resolvers awsvpc inter 2000 fall 3
        server read02 dbserver02:3306 check port 3306 resolvers awsvpc inter 2000 fall 3

    ほとんど同じように見えるので差分をまとめると、以下のような違いだ

    これで

    • tsukada001の3306ポート
    • tsukada002の3306ポート

      に接続すると、dbserver01,dbserver02へラウンドロビンで接続されるようになった

    しかし、これでは当然tsukada001、tsukada002自体で障害が起きる可能性もある。

    ALBでバランシング

    tsukada001:3306、tsukada002:3306をALBに登録しラウンドロビンで登録した。

    これによりALBのエンドポイントが払い出され、それを各プログラムが参照するような形にして可用性を担保した。

    振り返って見て思うこと

    レガシーなDBでこの構成を組もうとすると、できないことはないが、登場人物がやたら多い。一番なのはauroraなどに移行し、本当に必要なことのみに集中できれば最高だ。

     

     

  • SSL証明書の有効期限を外部から確認する

    SSL証明書の有効期限を外部から確認する

    はじめに

    近年SSL対応したページが当たり前になってきた。AWSであればAWS Certificate Manager (ACM)の機能で自動で証明書を更新してくれるが、念には念を期限くらいは監視しておきたい。また、Let’s encryptを使う環境だと3ヶ月ごとに期限切れになるので、有効期限を監視するのはとても重要だ。外部から証明書の有効期限を確認するコマンドを紹介。

    実施コマンド

    Linuxの場合

    実は非常に簡単に確認ができる

    Linuxの場合はだいたい標準でOpenSSLがインストールされているので、そのコマンドで確認ができる

    openssl s_client -connect tsukada.sumito.jp:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not "
                Not Before: Mar 20 09:14:22 2018 GMT
                Not After : Mar 20 09:14:22 2019 GMT

    URLの部分を変えれば、どの環境でも対応できる

    Macの場合

    brewコマンドでインストール

    brew tap genkiroid/homebrew-cert
    brew install cert

    あとはcertコマンドで後ろに確認したいサイトのURLを記載するのみ。シンプル!

    cert tsukada.sumito.jp
    DomainName: tsukada.sumito.jp
    IP:         35.187.235.61
    Issuer:     Let's Encrypt Authority X3
    NotBefore:  2018-07-18 16:45:33 +0900 JST
    NotAfter:   2018-10-16 16:45:33 +0900 JST
    CommonName: tsukada.sumito.jp
    SANs:       [tsukada.sumito.jp]
    Error:      

     

     

  • Ansibleで特定サーバのみ振る舞いを変える

    Ansibleで特定サーバのみ振る舞いを変える

    はじめに

    Ansibleで構成管理をしていると、ある全台ではなくある特定のサーバだけ設定を変えたい時がある。WEBサーバ全体ではなく、その中の1台のみ実施したいという時だ。Ansibleのtipsを紹介。

    Ansibleで特定サーバのみ振る舞いを変える

    例えばcronをコメントアウトすることを例にする。

    1. Ansibleのinventoriesのhostsファイルを変更
      以下の通り
      [web]
      web01 ansible_host=192.168.10.10 ansible_ssh_private_key_file=~/.ssh/key
      web02 ansible_host=192.168.10.11 ansible_ssh_private_key_file=~/.ssh/key
      
      
    2. ansible-playlistを編集し、サーバ名を取得する。
      - name: check Hostname
      hostname:
      name: '{{ inventory_hostname }}'
      tags: edit_cron

      inventoriesでいうところのweb01やweb02がこれに該当する

    3. replaceを使う
      特定サーバの場合振る舞いを変える
      web02だけあるcronを変えたい場合
      - name: comment out for 02
      replace:
      path: /var/spool/cron/cronuser
      regexp: '^\* \* \* \* \* echo hello'
      replace: '#* * * * * echo hello'
      when: inventory_hostname is search("02")
      tags: edit_cron

      を定義することにより、02のecho helloだけコメントアウトされる

     

  • 自分のグローバルIPアドレスを確認する

    自分のグローバルIPアドレスを確認する

    はじめに

    内部通信で使うサーバやMacBookのアドレスはOSに付いているip addrなどのコマンドでわかるけど、残念ながらグローバルIPはOSを確認するコマンドはOSに付いていない。外部サービスに問い合わせ、自分のIPを聞くのが一般的だ

    自分のIPを確認する

    ブラウザで確認する場合

    https://www.cman.jp/network/support/go_access.cgi へアクセスすると、接続しているマシンのIPアドレスがわかる。他の拠点のスタッフにIPアドレスを確認するのによく使う。

    CUIで確認する場合

    $ curl -s httpbin.org/ip 
    {
      "origin": "123.12.1.11"
    }
    

    IPのみを取り出したい場合はjqコマンドを使うとIPのみ取り出せる。

    $ curl -s httpbin.org/ip | jq -r .origin
    123.12.1.11

     

  • mysqlのユーザー作成や権限付与の際よく使うコマンド

    mysqlのユーザー作成や権限付与の際よく使うコマンド

    はじめに

    mysqlのユーザーを作成し、権限を適宜設定することが多いがよく使うコマンドをまとめた。

    ユーザーを確認する

    MariaDB [(none)]> select user,host from mysql.user;
    +--------+------------+
    | user   | host       |
    +--------+------------+
    | root   | 127.0.0.1  |
    | redash | 172.18.0.% |
    | root   | ::1        |
    |        | instance-1 |
    | root   | instance-1 |
    |        | localhost  |
    | root   | localhost  |
    +--------+------------+
    7 rows in set (0.00 sec)
    
    MariaDB [(none)]> show grants for 'redash'@'172.18.0.%';

    ユーザーを作成する

    パスワードを平文で入れる

    GRANT USAGE ON *.* TO 'usera'@'192.168.10.10' IDENTIFIED BY 'password123';

    パスワードをハッシュ化して登録

    SELECT PASSWORD('password123');
    #出力されたハッシュを以下に入れる
    GRANT USAGE ON *.* TO 'usera'@'192.168.10.10' IDENTIFIED BY PASSWORD '*6D4B1BD281FE14CCBC97B934';

    権限付与

    参照のみ

    GRANT SELECT, EXECUTE ON `databasea`.* TO 'usera'@'192.168.10.10'

    データ操作言語(DML)文

    GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `databasea`.* TO 'usera'@'192.168.10.10'

    権限を剥奪する

    全権限を剥奪する

    REVOKE ALL ON `database`.* FROM 'usera'@'%' 

    部分的に剥奪する

    REVOKE DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `database`.* FROM 'usera'@'%' 

    接続元を変更する

    どこからでもアクセスできた状態からアクセス元を特定セグメントからのみに絞る

    rename user 'usea'@'%' to 'usera'@'192.1.%';

     

    パスワード変更

    すでに作ったユーザのパスワード変更は以下のコマンド

    set password for 'usera'@'192.168.10.10'=password('パスワード');

    ユーザを削除する

    DROP USER 'usera'@'192.168.10.10';

     

  • GitLabでCIを動かす

    GitLabでCIを動かす

    はじめに

    Gitと連携させCIを動かす事が増えて来た。GitHubと連携させTravis CIもいいし、Circle CIもいいだろう。GitLab CIのいいところは、自前で環境さえ準備できさえすれば非常に低コスト(IaaSの運用コストのみ)で動かす事ができるのが魅力だ

    設定方法

    前提条件

    GitLabが動作できていること

    本手順は、GitLab 10.3.7を前提としている

    GitLabの設定

    GitLabの左メニューで Settings -> CI/CDを選択する

    General piplines settingsで
    「Instance default」を選択し、Runner Tokenをひかえる

     

    CIサーバ側の設定

    GitLab CIサーバでGitLab runnerの設定をいれる

    # sudo gitlab-runner register
    
    Running in system-mode.
    
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
    https://git.sumito.jp/
    Please enter the gitlab-ci token for this runner:
    SJxxxxxxxxxxxx
    Please enter the gitlab-ci description for this runner:
    [server]: projectA
    Please enter the gitlab-ci tags for this runner (comma separated):
    
    Whether to lock the Runner to current project [true/false]:
    [true]: true
    Registering runner... succeeded runner=xxxxxxx
    Please enter the executor: parallels, ssh, virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, shell, kubernetes:
    shell
    Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

     

    automatically reloaded!と表示されれば設定は問題ない

    .gitlab-ci.ymlの設定

    .gitlab-ci.yml 
    variables:
    AMI_ID_KUSANAGI: "ami-123456"
    INSTANCE_NAME: "${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}_${CI_PIPELINE_ID}"
    TMP_ANSIBLE_DIR: "/tmp/gitlab/${CI_COMMIT_SHA}/${CI_PIPELINE_ID}"
    DEPLOY_SITE: "wordpress"
    SSH_KEY_NAME: "ssh-key"
    INSTANCE_LOG: "/tmp/gitlab/${CI_COMMIT_SHA}/${CI_PIPELINE_ID}/run-instances.json"
    ALLOCATE_ADDRESS_LOG: "/tmp/gitlab/${CI_COMMIT_SHA}/${CI_PIPELINE_ID}/allocate-address.json"
    
    stages:
    - initial
    - build
    - test
    - deploy
    - cleanup
    
    ########################################################
    # STAGE:ANCHORS #
    ########################################################
    
    # These are hidden jobs that contain the anchors
    .server_group_1:
    only: &kusanagi_servers
    /^(wordpress).*$/
    
    ########################################################
    # STAGE:INITIAL #
    ########################################################
    make_tmp_directory:
    stage: initial
    script:
    - mkdir -p ${TMP_ANSIBLE_DIR}
    
    # デプロイテスト用インスタンスを作成@kusanagi& t2.medium
    run_aws_server_kusanagi:
    stage: build
    only:
    - *kusanagi_servers
    script:
    # インスタンスを作成
    - aws ec2 run-instances --key-name ${SSH_KEY_NAME} --image-id ${AMI_ID_KUSANAGI} --count 1 --instance-type t2.medium --security-group-ids sg-12345678 --subnet-id subnet-12345678> ${INSTANCE_LOG}
    # インスタンスにタグ付け
    - instance_id=`jq -r .Instances[].InstanceId ${INSTANCE_LOG}`
    - aws ec2 create-tags --resources $instance_id --tags Key=Name,Value=${INSTANCE_NAME}
    # ElasticIPを払い出してタグ付け
    - aws ec2 allocate-address --domain vpc > ${ALLOCATE_ADDRESS_LOG}
    - allocation_id=`jq -r .AllocationId ${ALLOCATE_ADDRESS_LOG}`
    - aws ec2 create-tags --resources $allocation_id --tags Key=Name,Value=${INSTANCE_NAME}
    # インスタンスのステータスがrunningになるまで待つ
    - i=1; while [ $i -le 120 ]; do sleep 3; if [ "\"running\"" = `aws ec2 describe-instances --instance ${instance_id} | jq '.Reservations[].Instances[].State.Name'` ]; then break; fi; i=$(expr $i + 1); done
    # ElasticIPをインスタンスに紐付け
    - aws ec2 associate-address --allocation-id ${allocation_id} --instance ${instance_id}
    
    # Ansible Playbookをgit clone
    setup_git:
    stage: build
    script:
    - cd ${TMP_ANSIBLE_DIR}
    - git clone git@git.sumito.jp:sumito/projectA.git
    - cd projectA
    - git checkout ${CI_COMMIT_REF_NAME}
    
    ########################################################
    # STAGE:TEST #
    ########################################################
    # 全てのAnsible Playbookの構文チェック
    check_syntax_ansible:
    stage: test
    before_script:
    - sed -e s%__ROLES_PATH__%${TMP_ANSIBLE_DIR}/projectA/Ansible/roles%g /home/gitlab-runner/.ansible_template.cfg > /home/gitlab-runner/.ansible.cfg
    - cd ${TMP_ANSIBLE_DIR}/projectA/Ansible
    script:
    - ansible-playbook -i inventories/staging/hosts sites/staging/wordpress.yml --syntax-check
    
    ########################################################
    # STAGE:DEPLOY #
    ########################################################
    # Ansible Deployを実行
    execute_ansible:
    stage: deploy
    only:
    - *kusanagi_servers
    before_script:
    - elastic_ip=`jq -r .PublicIp ${ALLOCATE_ADDRESS_LOG}`
    - cd ${TMP_ANSIBLE_DIR}/projectA/Ansible
    - sed -si -e s/__IP__/${elastic_ip}/g -e s%__KEY__%/home/gitlab-runner/.ssh/${SSH_KEY_NAME}%g inventories/staging/hosts
    - sleep 20
    script:
    - ansible-playbook -i inventories/staging/hosts sites/staging/${DEPLOY_SITE}.yml -u sumito --limit ${DEPLOY_SITE} --vault-password-file=/home/gitlab-runner/.vault_password
    
    ########################################################
    # STAGE:CLEANUP #
    ########################################################
    # Deployテストしたサーバリソースを削除@on_success
    remove_aws_server_success:
    stage: cleanup
    only:
    - *kusanagi_servers
    before_script:
    - instance_id=`jq -r .Instances[].InstanceId ${INSTANCE_LOG}`
    script:
    - sh /home/gitlab-runner/bin/aws/terminate-instance.sh $instance_id
    after_script:
    - rm -rf ${TMP_ANSIBLE_DIR}
    
    # Deployテストしたサーバリソースを削除@on_failure
    remove_aws_server_manual:
    stage: cleanup
    only:
    - *kusanagi_servers
    before_script:
    - instance_id=`jq -r .Instances[].InstanceId ${INSTANCE_LOG}`
    script:
    - sh /home/gitlab-runner/bin/aws/terminate-instance.sh $instance_id
    after_script:
    - rm -rf ${TMP_ANSIBLE_DIR}
    when: manual

    どのように動くか

    今回実施したPipelineは

    “`
    stages:
    – initial
    – build
    – test
    – deploy
    – cleanup
    “`

    の順番で処理が行われるよう骨格を作った。

    AWSのインスタンスをたちあげ、環境をセットアップし、ansibleを流す。最後にはテストで使ったイメージを削除するPipeline
    gitにpushする度にCIが動くようになり、品質が担保できるようになった。

  • ssh秘密鍵を元に公開鍵を復元する

    ssh秘密鍵を元に公開鍵を復元する

    はじめに

    秘密鍵は手元にあるけど、公開鍵がすぐに出せないということがよくある。
    しかし、秘密鍵を元に公開鍵を作成することは可能だ

    手順

    ssh-keygen -yf 秘密鍵

    リダイレクトすることにより、ファイルに出力が可能

    ssh-keygen -yf  /tmp/id_rsa > /tmp/id_rsa.pub.dump

     

    確認

    オリジナルの公開鍵と、秘密鍵を元に復元した公開鍵の違いはこちら

    [root@tsukada ~]# ssh-keygen -t rsa 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): /tmp/id_rsa
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /tmp/id_rsa.
    Your public key has been saved in /tmp/id_rsa.pub.
    The key fingerprint is:
    SHA256:HlWiUEHdOU5YteJv38bSB5oXXUQPuxqaubyvJK8dpzs root@tsukada
    The key's randomart image is:
    +---[RSA 2048]----+
    |      .o+o.+ooo..|
    |       . .oo=  +o|
    |        . .o..o..|
    |         . ... ..|
    |        S   o ...|
    |       . . + +o .|
    |        o * ooo= |
    |         *E=o.o.*|
    |        ..X*.. o+|
    +----[SHA256]-----+
    [root@tsukada ~]# 
    [root@tsukada ~]# ls -l /tmp/id_rsa*
    -rw------- 1 root root 1675  8月 17 19:36 /tmp/id_rsa
    -rw-r--r-- 1 root root  393  8月 17 19:36 /tmp/id_rsa.pub
    [root@tsukada ~]# 
    [root@tsukada ~]# ssh-keygen -yf   /tmp/id_rsa > /tmp/id_rsa.pub.dump
    [root@tsukada ~]# ls -l /tmp/id_rsa*
    -rw------- 1 root root 1675  8月 17 19:36 /tmp/id_rsa
    -rw-r--r-- 1 root root  393  8月 17 19:36 /tmp/id_rsa.pub
    -rw-r--r-- 1 root root  381  8月 17 19:36 /tmp/id_rsa.pub.dump
    [root@tsukada ~]# diff /tmp/id_rsa.pub /tmp/id_rsa.pub.dump
    1c1
    < ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDhAoTIS70SmsUKkYp+J11UdnbEqmHmJ1rZP9lbXlP7jDqYZbOKV761CIEtgAuObxNDsr7fh2K0/eH4P+Ie1JB4yFsAQdyQnIqR0BEOT+3DKdSVDJP6ec0iOGl5XrAqbx3rs5pCfUBC3tD8EQHpKOrRHxp7m+o3QnljGtAL0cBMb+3n4dw4Lapq3L0ZOaeXzmuH7efOLT/u6wUQVzWACSZ2z4Jssei22nkJXgXXM6pkV7ejkbNZUppKJZe5drYvW4TJPqKYeAktDr6tnhDJ6n1Qgy3SjWGaDcJ7UKa2CG/84y+I9Et2BXiJaUd5qNMBITx26RDMcNoxTbGSOp1IZwPr root@tsukada
    ---
    > ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDhAoTIS70SmsUKkYp+J11UdnbEqmHmJ1rZP9lbXlP7jDqYZbOKV761CIEtgAuObxNDsr7fh2K0/eH4P+Ie1JB4yFsAQdyQnIqR0BEOT+3DKdSVDJP6ec0iOGl5XrAqbx3rs5pCfUBC3tD8EQHpKOrRHxp7m+o3QnljGtAL0cBMb+3n4dw4Lapq3L0ZOaeXzmuH7efOLT/u6wUQVzWACSZ2z4Jssei22nkJXgXXM6pkV7ejkbNZUppKJZe5drYvW4TJPqKYeAktDr6tnhDJ6n1Qgy3SjWGaDcJ7UKa2CG/84y+I9Et2BXiJaUd5qNMBITx26RDMcNoxTbGSOp1IZwPr
    [root@tsukada ~]# 
    [root@tsukada ~]# 

    公開鍵の後ろに作成したuser@serverが入るのがオリジナル。入らないのが復元した公開鍵。もちろん機能的にはまったく同じく使うことが可能だ

  • hint: Updates were rejected because the tip of your current branch is behind

    hint: Updates were rejected because the tip of your current branch is behind

    はじめに

    git pushすると以下のようなエラーが出てrejectされることがある

    $ git push origin BranchName
    error: failed to push some refs to 'xxxx'
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Integrate the remote changes (e.g.
    hint: 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    $

    原因

    local branchが古い

    対処

    local branchを最新にする必要がある

    $ git pull origin BranchName
    From xxxx
     * branch            xxxx -> FETCH_HEAD
    Auto-merging xxxx
    Merge made by the 'recursive' strategy.
     xxxx | 1 +
     1 file changed, 1 insertion(+)
    $ 

     

     

     

  • VyOSでルーティングを設定する

    VyOSでルーティングを設定する

    はじめに introduction

    CiscoライクなオープンソースのVyOSというOSSのrouterがある。
    メインのクラウドがAWSやGCPであればVyOSを使わなくてもよいが、さくらインターネットなどで作業をする際は、まだまだVyOSのお世話になることが多い。よくある手順をまとめた。

    There is an OSS router called Cisco-like open source VyOS. If your main cloud is AWS or GCP, you don’t need to use VyOS, but when you work on the Sakura Internet, there are still many things to take care of for VyOS. Summary of common procedures

    前提条件 Prerequisites

    IPは以下の通り

    IPs are below

    IP
    Global IP 200.20.0.2
    host192.168.0.11
    接続元IP100.10.0.1

    GlobalIPを追加する Add GlobalIP

    追加するシステム(サーバ)に新しいGlobalIPを追加。今回は200.20.0.2/32を新しく追加する

    New GlobalIP is added to the system (server) to be added. Add 200.20.0.2/32 this time.

    # 使用するグローバルIPを定義
    # Define global IP to use
    set interfaces ethernet eth0 address '200.20.0.2/32'

    ポートフォワードの設定 Port forward settings

    “` 200.20.0.2:443“` に来たアクセスを、“` 192.168.0.11:443 “` に送る。今回はポートの変換を行わないが、この設定を変更することにより、サーバに届くポートを変更することが可能。

    Send the access that came at “` 200.20.0.2:443“`  to “` 192.168.0.11:443“`. This time, port conversion is not performed, but it is possible to change the port that reaches the server by changing this setting.

    set nat destination rule 100 destination address '200.20.0.2'
    set nat destination rule 100 destination port '443'
    set nat destination rule 100 inbound-interface 'eth0'
    set nat destination rule 100 protocol 'tcp'
    set nat destination rule 100 translation address '192.168.0.11'
    set nat destination rule 100 translation port '443'

    ※ rule 100の番号はユニークな値にすること

    * The rule 100 number must be a unique value.

    Firewall設定 Firewall settings

    設定したルーティングを全ての人に使わせず、限られた人のみ使わせたいことがある。今回は接続元のIPを限定する方法。 接続元 “` 100.10.0.1 “` からの接続のみ、“` 192.168.0.11:443 “` へ接続許可する

    There are times when you want to use only the limited people without using the set routing. This time, the method of limiting the connection source IP. Only connections from the connection source “` 100.10.0.1“`  are allowed to connect to “` 192.168.0.11:443“`

    # インターネット側からVyOSに対するファイアウォールを設定
    # Set firewall for VyOS from internet
    
    # 接続元100.10.0.1からの接続のみ、192.168.0.11:443へ接続許可
    set firewall name FW-eth0 rule 100 action 'accept'
    set firewall name FW-eth0 rule 100 destination address '192.168.0.11'
    set firewall name FW-eth0 rule 100 destination port '443'
    set firewall name FW-eth0 rule 100 protocol 'tcp'
    set firewall name FW-eth0 rule 100 source address '100.10.0.1'

    ※ rule 100の番号はユニークな値にすること

    * The rule 100 number must be a unique value.

    アウトバウンドのIPを設定 Set outbound IP

    この設定をしないと、インターネットの外にパケットが出て行くことができない。今回は“` 192.168.0.11“` のローカルIPを、グローバルIP “` 200.20.0.2 “`に変換する。

    Without this setting, packets cannot go out of the Internet. This time, the local IP of “` 192.168.0.11 “`  is converted to the global IP “` 200.20.0.2“`

    set nat source rule 100 outbound-interface 'eth0'
    set nat source rule 100 source address '192.168.0.11'
    set nat source rule 100 translation address '200.20.0.2'
    

    ※ rule 100の番号はユニークな値にすること  

    * The rule 100 number must be a unique value.

  • AnsibleError: template error while templating string

    AnsibleError: template error while templating string

    はじめに

    AnsibleのTemplateモジュールはファイルの中身に変数を入れたいときなどにとても便利。
    なお、Templateモジュールの使い方については、あだちんさんのブログが非常にわかりやすい。

    Ansible’s Template module is very useful when you want to put variables in the contents of a file.
    About how to use Template module, His blog is very easy to understand.

    https://blog.adachin.me/archives/5526  

    問題 problem

    AnsibleでTemplateの転送に失敗する

    Template transfer fails with Ansible

    TASK [setup-hosts/development/web : Add Template user-setting files] ********
    failed: [dev-web] (item={u'owner': u'cron', u'path': u'home/cron/script/backupcp.sh', u'group': u'cron', u'mode': u'755'}) => {"changed": false, "item": {"group": "cron", "mode": "755", "owner": "cron", "path": "home/cron/script/backupcp.sh"}, "msg": "AnsibleError: template error while templating string: Missing end of comment tag. String: ` '<<<<<'\n"}
    

    特定の文字列がファイル内に存在しているとAnsibleに失敗するようだ

    Ansible seems to fail if a specific string exists in the file

    対処 deal

    処理の最初、最後をそれぞれ、“` {% raw %} “` 、“` {% endraw %} “` で挟む。以下のようなイメージ

    Insert “` {% raw%}  “` and “` {% endraw%} “` at the beginning and end of processing. The following image

    {% raw %}
    #!/bin/sh
    
    echo "done"
    {% endraw %}