#author("2022-10-19T23:17:28+00:00","default:wikiadmin","wikiadmin")
-プロビジョニングツール

#contents

*Warning対応 [#i7ef1687]

 [DEPRECATION WARNING]: Invoking "dnf" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying `name: "{{ item }}"`, please use `name: ['bind', 'bind-utils']` and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

**ループ除去 [#k8a87920]

 - name: install bind
   dnf:
     name={{ item }} state=latest
   with_items:
     - bind
     - bind-utils

 - name: install bind
   dnf:
     name:
       - bind
       - bind-utils
     state:
       latest
*改善 [#hccf5463]

+yum から dkfへ
+S3から使ってないarchive除去
+mavenが手動ダウンロード前提なのでなんとかする
+geo_ipもなんとかしたい

*自作Ansible対応状況 [#ge8f3b71]

**aws graviton2 [#tf1f1e1f]

-armなのでリポジトリを削る必要がある。percona toolkitは一回失敗
-PHPが文字化ける。mbstringはあるのに再起動で回復するのだがなぜだ?

*通信量計測 202005 [#e4bca407]

-centos8で計測してみた

|setup|400M||
|apps|180M|jdkがでかい|
|myapps java|500|他が無視できるほどjava関連の容量と時間食う。350M+chrome/nodeで170M|

-recover前までで1.2G程度(javaが大きい?)


**CentOS8 [#zcfe7d1d]

-dockerの代わりにpodman-docker

|Kagoya|Postgresでエラー|
|Conoha||
|自宅vmware|minimalだとpythonすらないのでsecureで|

**VPS [#z7fa81b4]

|Sakura VPS 2G||
|KAGOYA VPS KVM|PyYAMLがバージョン競合(インストールするほうが新しい)。あったらパスするロジック|
|お名前.com VPS 2G||
|awshost|centos7限定のところを見直し(python-selinux),dnfがない|

**自宅 [#oa39e9bc]

*Ansible完全読本 [#l3e80e0d]

-ansible-pullを使うとpull型アーキテクチャにも対応できる。
-rawモジュールを利用するとpythonなしでも利用できる。python自体をリモートにインストールするとか!

*最新版はつかわないこと [#s4fa997d]

-2.3.1.0にてs3のアップロードに失敗するバグに遭遇

*2.0への移行 [#rd5387f6]

2.0が2016/01にリリースされたが随所で変更が必要。

**Block [#v37181ca]

複数の処理をまとめることができる。さらにrescue,alwaysを組み合わせるときり戻しに近いことができる。


**インベントリなどのsudo [#icc08fa4]

|ansible_sudo|ansible_become|

**playbookのsudo [#of0cf1ed]

|sudo|become|
|sudo_user|become_user|

**playbookの変数 [#s9b522c0]

 [DEPRECATION WARNING]: Using bare variables is deprecated. Update your playbooks so that the environment value uses the full variable syntax ('{{yum_basic_items}}').This feature will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

 with_items:
   yum_epel_items → '{{ yum_epel_items }}'に変更

**定義済み変数の確認 [#p1436667]

 ansible -m setup localhost
 ansible -m setup -i hoset HOSTNAME

*インストール前に [#m389e3bc]

コントロールされる側に以下のパッケージが必要。

python-simplejson

*Install [#a1ef0832]

-Ubuntuでは公式が古いのでPPA利用してインストール

 sudo apt update
 sudo apt install software-properties-common
 sudo apt-add-repository --yes --update ppa:ansible/ansible
 sudo apt install ansible

-Pythonのパッケージ管理であるpipを使うと楽。python-develとgccが必要。

 yum install python27-devel
 pip-2.7 install ansible


-EPEL から yum でもインストール可能。

 yum install ansible --enablerepo=epel

**CentOS 6.x [#b4b68f6c]

 yum install python-pip.noarch
 yum install python-devel.x86_64
 pip install PyCrypto==2.3
 pip install ansible

**yumかaptかの判定 [#vbeb6ad7]

 when: ansible_pkg_mgr == 'apt' or 'yum'

*Windows/CygwinでAnsible [#ic405092]

-以下のパッケージが必要

+gcc-core
+openssh
+python
+python-setuptools

-cygwinで以下のコマンド実施して入れる

 easy_install-2.7 pip
 pip2.7 install ansible

-sshパスワードログインするにはsshpassが必要。

 http://server-setting.info/blog/sshpass-cygwin-autologin.html#sshpass_1


*設定ファイル [#e36529ef]

ansible.cfgファイルの探す順番は以下の通り。

+カレントディレクトリ
+環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
+/etc/ansible/ansible.cfg

カレントにおいておけばそこが一番に読み込まれる。以下のように記載しておけば-iでインベントリを指定しなくてよい。

 [defaults]
 hostfile       = hosts


*インベントリ(操作対象ホスト) [#b06e7a3f]

 # local
 localhost ansible_connection=local
 # SSHポート 10022でユーザーはremote_user
 remote.example.com  ansible_ssh_port=10022  ansible_ssh_user=remote_user ansible_ssh_private_key_file=~/.ssh/KEY_FILE  ansible_ssh_host=192.168.1.50

クラウド向けにはDynamic Inventoryという概念がある。詳細は公式HPで収集せよ。

**パラメータ [#ff63884d]

|ansible_ssh_host|ホスト名に対しての実IP|
|ansible_ssh_port|SSHポート|
|ansible_ssh_user|SSHユーザ|
|ansible_ssh_pass|SSHパスワード。べた書きは非推奨なので--ask-passオプションを付けて実施するか公開鍵認証推奨|
|ansible_sudo|sudoを使うかどうか。デフォルトはfalse|
|ansible_sudo_pass|sudo のパスワード。危険なので--ask-sudo-passオプションを推奨)|
|ansible_sudo_exe (new in version 1.8)|sudo コマンドへのパス|
|ansible_connection|local, ssh or paramiko. |
|ansible_ssh_private_key_file|秘密鍵ファイルの場所|
|ansible_shell_type|シェル|
|ansible_python_interpreter|ログイン側のpython|
|ansible\_\*\_interpreter|ansibleのインタープリタの場所|

*変数定義 [#e5941d20]

 hoge: value
 hogearray:
   - one
   - two
   - three

*ワンラインで簡易実行 [#t77c2971]

-インベントリを用意を用意して以下のように実行する。

|ansible web03 -a "ls" -i hosts|ls|
|ansible web03 -a "ls" -i hosts --ask-pass|ls|
|ansible web03 -m copy -a "src=/etc/hosts dest=/tmp/hosts" -i host|操作元ホストからリモートホストへファイルコピー|

*文法チェックと空実行(dry run) [#lcd9b61e]

-文法チェック

 ansible-playbook -i hosts simple-playbook.yml --syntax-check

-タスク一覧の表示

 ansible-playbook -i hosts simple-playbook.yml --list-tasks

-空実行(dry run)

 ansible-playbook -i hosts simple-playbook.yml -C

*推奨ディレクトリ構成 [#b34b0116]

 TOP
   -vars
   -roles
   hosts

*Role [#k4b4d2c0]

-公式サイトによればRoleは非常に便利とのこと


*Playbook [#a57e2726]

 - hosts: all
   user: hoge
   tasks:
     - script: /home/hoge/test.sh

**インクルード(条件分岐あり) [#uc4e9c01]

 ---
 - include: setup-web.yml
   when: type == "WEB"
 - include: setup-db.yml
   when: type== "DB"

**yum まとめてインスコ [#ic6d2445]

 - name: yum install
   yum:
     name={{ item }}
   with_items:
    - httpd
    - php

**httpd,openjdkインストール(分割推奨) [#i7e16019]

 - hosts: web03
   user: ec2-user
   tasks:
     - name: Install httpd
       yum: name=httpd state=latest
       sudo: yes
     - name: apacheが起動していることを確認
       action: service name=httpd state=started
       sudo: yes
     - name: "設定の修正(1)"
       lineinfile: >-
         dest='/etc/httpd/conf/httpd.conf'
         state=present
         backrefs=yes
         regexp='^#?\s*ServerTokens'
         line='ServerTokens Prod'
       sudo: yes
       notify: apache restart
     - name: Install openJDK
       yum: name=java-1.8.0-openjdk-devel state=latest
       sudo: yes
   handlers:
     - name: apache restart
       service:
         name=httpd
         state=restarted
       sudo: yes

-セキュリティ周りの設定tag名称をsecurityにしている。

 ansible-playbook -i hosts tcp_wrapper.yml --tags "security"

 - hosts: web03
   user: ec2-user
   tasks:
     - name: deny all service
       lineinfile: >-
         dest='/etc/hosts.deny'
         state=present
         line='ALL: ALL'
       sudo: yes
       tags:
         - security
     - name: enable ssh for limited ip
       lineinfile: >-
         dest='/etc/hosts.allow'
         state=present
         line='sshd: 172.20.128.'
       tags:
         - security
         - othertag
       sudo: yes

-こちらはユーザーの作成。パスワードはハッシュ化したものを指定する。以下のコマンドで作成できる。
 python -c 'import crypt; print crypt.crypt("YOURPASSWORD", "$1$SomeSalt$")'

 - hosts: web03
   user: ec2-user
   vars:
     user_name: normaluser
     user_pass: '$6$P0ky3YE5$JNFD0EuY52rXeVtNVypSMkB3chjHWu9z3o.8KMANeblkEe8p7ZOD0HSuPGT0pbzgHW2kP.xo4zE17tM6wy.1Y1'
   tasks:
     - name: Add a new user
       user: name={{user_name}} password={{user_pass}} groups=wheel state=present
       sudo: yes

 - hosts: web03
   user: ec2-user
   tasks:
     - name: touch
       shell: touch /var/tmp/{{ item.path }}
       with_items:
         - { path: 'hoge' }
         - { path: 'fuga' }
     - name: result test
       shell: echo "hoge"
       register: result
       failed_when: result.rc not in [0, 1]
     - name: catしたものをcontents変数に入れる
       shell: cat /etc/passwd
       register: contents
     - name: contents変数の標準出力にrootが含まれるときは実施
       shell: ls
       when: contents.stdout.find('root') != -1
     - name: 日付変数を作成してそのファイルを作る
       shell: date +'%Y%M%d%I%M%S'
       register: datestring
     - name: 日付のフォルダ作成
       shell: touch /var/tmp/{{ datestring.stdout }}
     - name: symlink作成
       file: src=/var/tmp/{{ datestring.stdout }} dest=/var/tmp/latest state=link

-公開鍵を設定

 - name: setup authorized_key
   authorized_key: user=user1 key="{{ item }}"
   with_file:
     - id_rsa.pub

-ディレクトリを列挙して、それを消す

    - name: 古いディレクトリを特定する。
      shell: ls -t1 | tail -n +5
      args:
        chdir: /var/tmp
      register: old_dirs
    - name: 古いディレクトリ削除
      file: path={{ item }}
      with_items: old_dirs.stdout_lines

-Jenkins.warがなければダウンロードさせる(ファイル存在チェックとダウンロード)

 - name: jenkins exists check
   stat: path=/var/cache/ansible/jenkins.war
   register: jenkins
 - name: Jenkinsをダウンロードする
   get_url:
     url: http://mirrors.jenkins-ci.org/war/latest/jenkins.war
     dest: /var/cache/ansible/
   when: jenkins.stat.exists == False

*Taskモジュール [#oe3c52a8]

-出来合いのモジュールがたくさんある

**一覧 [#cc8a4160]

|ec2|Amazon ec2|boto required for this moduleとでたら、pip install boto|
|s3|Amazon s3|
|shell|シェルを実行だが、コマンドも実行できる|

**変数の出力 [#tb00edce]

 -name: debug
  debug: var=p

**MySQL操作 [#sef8c376]

''リモート側にMySQL-pythonモジュールが必要。場合によってはyumではなくpipで入れないと認識しないので注意。''

 - name: MySQL DB 設定
   mysql_db: name=DB_NAME state=present
 - name: MySQL user hoge 追加(ローカル限定のユーザ)
   mysql_user: name=hoge password=hoge priv=DB_NAME.*:ALL state=present
 - name: MySQL user hoge 追加(どこからでもOKユーザー)
   mysql_user: name=hoge host=% password=hoge priv=DB_NAME.*:ALL state=present

**EC2作成 [#o8365895]

 - name: ec2インスタンスを作成する
   ec2:
     aws_access_key: アクセスキー
     aws_secret_key: シークレットキー
     region: ap-northeast-1
     instance_type: t2.micro
     keypair: キーペア名称
     group: セキュリティグループ(複数ある場合はカンマ区切り)
     image: AMIイメージID
     vpc_subnet_id: サブネットID
     assign_public_ip: yes
     wait: yes
     instance_tags:
      Name: 名前
     volumes:
       - device_name: /dev/xvda
         snapshot: snap-07b5593c→AMIが利用しているsnapshot IP
         volume_size: 100
   register: ec2_status
   tags: create

**EC2作成後.ssh/configにIP記載 [#h7815eba]

 - name: .ssh/configに追記
   shell: >-
     echo Host awshost >> ~/.ssh/config;
     echo User ec2-user >> ~/.ssh/config;
     echo HostName {{ ec2_status.instances[0].public_ip }} >> ~/.ssh/config;
     echo IdentityFile ~/.ssh/YOUR_KEY.pem >> ~/.ssh/config;
   tags: ssh_config

-結果の変数から取得できる値

|インスタンスID|ec2_status.instances[0].ID|
|private_ip|ec2_status.instances[0].private_ip|
|public_ip|ec2_status.instances[0].public_ip|


**s3アップロード/ダウンロード [#z29ea7bb]

-get

 - name: S3からMasterのIPをダウンロードする
   s3:
     aws_access_key: 
     aws_secret_key: 
     region: ap-northeast-1
     bucket: バケット名
     dest: /var/tmp/任意のパス
     object: /バケット名以下のパス/ファイル名
     mode: get

**lineinfile[#ie79a670]

置換に便利なモジュール

-無条件で以下の一行を追加する(二度実行しても大丈夫)

 - name: tomcat memory setting
   lineinfile:
     dest: /etc/tomcat8/tomcat8.conf
     line: JAVA_OPTS="-server"

-正規表現に引っかかる行を置換する(複数の場合は最後に一致した行)

- name: tomcat javahome setting
  lineinfile:
    dest: /etc/tomcat8/tomcat8.conf
    regexp: ^JAVA_HOME
    line: JAVA_HOME="/usr/local/java/jdk1.8.0"

**Command Module [#da755925]

リモートでOSコマンドを実施する。

 # Example from Ansible Playbooks.
 - command: /sbin/shutdown -t now
 
 # createsに指定されたファイルがない場合はcommandの処理を実行
 - command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

 # somedir以下に移動し、かつ
 # createsに指定されたファイルがない場合はcommandの処理を実行
 - command: /usr/bin/make_database.sh arg1 arg2
   args:
     chdir: somedir/
     creates: /path/to/database

 #繰り返し処理のサンプル。変数定義済みであればwith_items:{{users}}でもOK
 - name: add several users
   user: name={{ item }} state=present groups=wheel
   with_items:
      - testuser1
      - testuser2

 #コンパイルのタスクだが、実際にはシェルが実行できるのでなんでもOK
 - name: Apacheコンパイル
   shell:
     make
       chdir=/usr/local/src/httpd-2.4.12
       creates=/usr/local/apache/2.4.12/bin/httpd

**Script Module [#o42793d1]

操作先にShellを送り込んで実行。操作先にpythonが必要ないのもメリット

**Shell Module [#b6a7badd]

Ansibleの実行サーバー先にあるshファイルをリモートに送り込んで実行できる。


*Tips [#k0924b99]

**Dry-run [#befa66a4]

***チェックモードと実行ログにチェックモードであることを表示する。 [#j55eb052]

 --check

 ansible.cfgに以下の記述を追加
 [defaults]
 check_mode_markers = yes

***実行後の差分を表示するdiffオプション。checkと併用可能 [#k0f6bd1d]

 --diff


**途中から実施 [#t6969604]

--start-at="taskのname"

**一ステップずつ確認 [#b3c26666]

--step

**外部変数(extra_vars) [#ff48ddad]

http://d.hatena.ne.jp/akishin999/20130818/1376824640

-実行時に変数を指定する(extra-varsで指定したもの場すべてに優先する)

 ansible-playbook -i hosts setup.yml --extra-vars "admintool_seup=true" --tags=admintool


**SSH接続時のキーチェック無効化 [#b73a72a0]

-新規のサーバーだとそこで処理が止まってしまうので、鍵のチェックを無効化する。
-新規のサーバーだとそこで処理が止まってしまうので、鍵のチェックを無効化する。configに記載する方法はダメだったっぽい

|実行時の環境変数で設定|export ANSIBLE_HOST_KEY_CHECKING=False|


**Playbookがまったく実行されない [#wd060084]

 - name: OK
 -name: NG

**謎のエラー [#vbc47341]

ローカルのパーミッションがNGだと内部モジュールでエラーがでてわかりづらい。コピー元はtemplateディレクトリに入れておくべき!

**roleの条件の変数を勝手に書き換えたらroleの残りがスキップされた [#s89916f2]

考えてみりゃそりゃーそうだ。というわけで条件に使っている変数はグローバルなので変に共有しないこと!

*条件 [#e7f8c9ad]

変数は{{}}で囲まないので注意

 - user: root
   hosts: all
   tasks:
     - name: install mlocate
       yum: name=mlocate state=installed
       when: install == "y"

**初接続時の注意 [#wed2c9f0]

公開鍵が保持されていないとエラー。以下の記事を参考に自動化できぬものか!

http://qiita.com/kawaz/items/20983ec286088a1ae5c7

**SSHパスワード接続時の注意 [#j1d4eeda]

 --ask-passオプションをつけるとSSHパスワード接続で実行できるが、sshpass.x86_64をyumインストールしておく必要がある。パスワードだとキーチェックが入るので一回接続しておくか、下記で無効にしておく。

 export ANSIBLE_HOST_KEY_CHECKING=False

**Selinux有効だとエラー [#b1af8f8b]

 target uses selinux but python bindings (libselinux-python) aren't installed!

無効にしてしまう!

**MysqlDB作成できない [#d59e94a1]

-以下のエラー・・・。クライアント側にインストールが必要!

 the python mysqldb module is required

**マルチバイトのファイル名をunarchiveするとエラー。 [#mede04e9]

マルチバイトがあるのが残念なので、以下のコマンドで見つけて治す。

 find . | grep \[^\ a-zA-Z0-9_:/@,%\\=\;\'\&\\\[\\+\\\(\\\)\\!\\.\\\-\]

*proxy利用 [#o443a382]

接続先がproxy必須の場合、Linuxの設定としてproxyをセットするのがよいかも!

-/etc/environment

*ansible完全読本メモ [#b91235b6]

-YAML 1.2には対応していないが、他のライブラリとの互換性で1.2に対応した記述をすると良い。特にBooleanの記載はtrue/falseにしておくこと


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS