Ansible

AnsibleでコピーするときはSynchronizeモジュール使ったほうが幸せになれる

背景 Ansibleでターゲットホストに何かをコピーするとき copyモジュールを使ってる人はとても多いと思います。 しかし恐ろしいぐらい遅いため、ansible copy slow何かで調べると 色々対策が書かれている記事があると思います。 まあそれを試しても劇的な改善はなく、結果として意味のないものです。   Synchronizeモジュールを使う Ansible – synchronize Copyモジュールと同等のことをやってみます。 1. ターゲットホストにファイルを配置する [crayon-5b76fc5b75cb9562784536/]   2. パーミッションを変更する [crayon-5b76fc5b75cc1868459597/] Synchronizeモジュールにもownerやgroupオプションはあるんですが これは Ansible 実行マシンに存在するユーザー、グループで且つ、 ターゲットホストにも存在しないといけないという制約があるので、 別タスクでパーミッション等を変更する必要があります。   比較 全部で350行ぐらいある Playbook の中のcopyモジュール版と Synchronizeモジュール版で比べた結果です。 Copy real 4m25.575s Synchronize real 2m12.755s 圧倒的

Ansibleのs3モジュールを使ってディレクトリごとアップロードする

梅雨の季節がやって参りました。 Ansibleのs3モジュールを使ってディレクトリごとアップロードする方法を覚え書きとして。   認証情報を環境変数に入れておく Ansibleで使うAWSの認証情報はPlaybookに書き込むか 環境変数を使うかで選べます。 万が一のことを考えて環境変数で管理したほうが良いと思います。 [crayon-5b76fc5b76003115621759/]   ファイルのアップロード [crayon-5b76fc5b76009381703544/]   ディレクトリごとアップロード(Ansible 2.3以降) [crayon-5b76fc5b7600c469226040/] key_prefixがないとバケット直下にファイルが展開されちゃうので key_prefixを設定しておきます。 こうすると BUCKET_NAME/source/<sourcecodeの中身> ってなる。   boto required for this module Ansibleを実行するホストでAWSの操作をする場合、 botoとかいうPythonのモジュールをインストールします。 加えてdelegate_to: 127.0.0.1をタスクに追加しないとリモート先で実行されてしまって エラーが消えないのでご注意を。 逆にリモート先で行うならリモート先で実行します。 [crayon-5b76fc5b76010004188534/]   それでも解決できない場合 引数にansible_python_interpreterをつけて実行する ansible-playbook -i production/hosts api.yml --extra-vars "ansible_python_interpreter=`(which python)" --user root --ask-pass hostsファイルにansible_python_interpreterをつける [crayon-5b76fc5b76013312754386/]  

AnsibleとMySQL 5.7で準同期レプリケーションを張る

覚書。 初めてAnsibleを触ってて少し躓いたところがあったので。   環境 ・Ansible 2.3.0 ・Percona server 5.7 (MySQL 5.7_     my.cnfを配置 Master用とSlave用のmy.cnfをリモート先へ送る。 [crayon-5b76fc5b761df486240077/]       rootパスワードを取得 MySQL 5.7から/var/log/mysqld.logにパスワードが記載されているので これを使って初期設定を行うらしい。 [crayon-5b76fc5b761e5485265464/]       .my.cnfを/rootに設置 Ansibleのmysqlモジュールを使うために/root/.my.cnfにファイルを設置 [crayon-5b76fc5b761e8876844727/] temp_my.cnf.j2 connect-expired-passwordが地味に大事 [crayon-5b76fc5b761ea703800100/]       rootパスワードを設定する 一時的なパスワードでは覚えられないので変更します。 パスワードの要件が厳しくなって大文字小文字記号数字で8桁以上とかだった気がする(覚えてない) [crayon-5b76fc5b761ed950789709/]       新しい.my.cnfを/rootに設置 [crayon-5b76fc5b761ef367386859/] new_my.cnf.j2 connect-expired-passwordを削除したバージョン [crayon-5b76fc5b761f1689821521/]       anonymousユーザーを削除 [crayon-5b76fc5b761f4432852949/]       レプリケーションユーザーを作成 [crayon-5b76fc5b761f6880887927/]       FlushコマンドってAnsibleじゃ使えないよね…? [crayon-5b76fc5b761f9345320699/]       マスターDBからダンプして、スレーブにインポート [crayon-5b76fc5b761fb483707433/]       マスターのファイル名とポジションの取得 ここが一番詰まった。 Ansibleは異なるホスト間で変数の参照ができないので ファイル名とポジションの取得はスレーブのときに実行して、実際に実行するコマンドはマスター側で処理をする。 [crayon-5b76fc5b761fe960512783/]   Change master [crayon-5b76fc5b76200661838708/]       スレーブの開始 [crayon-5b76fc5b76203385162801/]       スレーブの状況確認 Slave_IO_Running と Slave_SQL_RunningがどっちもYesであることを確認 [crayon-5b76fc5b76205694019529/]       マスターでロックしていたのを解除 [crayon-5b76fc5b76208278595791/]