#author("2021-11-08T00:22:15+00:00","default:wikiadmin","wikiadmin") #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にしておくこと